mysqldump - Yapıyı yalnızca otomatik artırma olmadan dışa aktar


88

MySQL veritabanım var ve otomatik artış değerleri olmadan yalnızca yapısını dışa aktarmanın bir yolunu bulmaya çalışıyorum. mysqldump --no-dataneredeyse işi yapacaktı, ancak auto_increment değerlerini koruyor. Bunu PHPMyAdmin kullanmadan yapmanın herhangi bir yolu var mı (yapabileceğini bildiğim kadarıyla)?


Görünüşe göre MySQL 5.5 (sunucu), --no-dataauto_increment değerlerini varsayılan olarak atlayacak.
Joey Adams

@JoeyAdams emin misin? Bu davranış ben deneyim değil
aland

2
@JoeyAdams MySQL 5.7. * 'S mysqldump, --no-data kullanılırken auto_increment'i ihmal etmez.
Tiberiu-Ionuț Stan

Yanıtlar:


70

Bunu yapabilirsiniz :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

Başkaları tarafından belirtildiği gibi, seddüzgün çalışmak istiyorsanız , g( g lobal değiştirme için) parametresini şu şekilde ekleyin :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(GUI Araçları yüklediyseniz bu sadece çalışır: mysqldump --skip-auto-increment)

Yorumlar sayesinde yeni GÜNCELLEME.

\bYararsız ve bazen komutu kıracak. Açıklamalar için bu SO konusuna bakın . Dolayısıyla, optimize edilmiş cevap şöyle olacaktır:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
--skip-auto-incrementGerçek bir seçenek olduğunu sanmıyorum . Belgelerde bulamıyorum . Bu sayıdaki iki MySQL hatasından hiçbiri bundan bahsetmiyor: 20786 , 30957 . Hangi mysqldump sürümünde bu seçenek var?
Zengin

1
--skip-auto-incrementdoğru hatırlıyorsa MySQL GUI Araçlarına eklenen bir seçenektir. (emin değilim ^^) Yani aslında gerçekten bir çözüm değil! Ancak ikinci satır içi komut doğrudur, burada konunun otomatik artırma sorunundan bahsettiği ve sedfiltreleme fikrini sağladığı yerde kurdum !
JoDev

4
Sed seçeneği, birden çok tabloyu dışa aktarırsanız tüm otomatik artışları kaldırmaz, yalnızca sonuncusunu. Ayrıca, --skip-auto-increment mevcut bir seçenek değildir. Bu yanıt nasıl bu kadar yüksek derecelendirildi?
Lex

3
sed komutunuzun sonunda ag'ye ihtiyacınız var: tüm olayları değiştirmek için sed 's /.../.../ g'.
p91paul

Bu komut doğru değil. --skip-auto-increment mevcut değil. Normal ifade doğru değil. P91paul'un belirttiği gibi, tüm oluşumların yerini alması için g değiştiricinin eklenmesi gerekir. Bunun yerine @JohnW çözümünü kullanın.
Aalex Gabi

52

JoDev'in cevabı, sed normal ifadesine küçük bir ayarlama yaparak benim için mükemmel çalıştı:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
Evet \b, bunun sed ifadesinde ne yaptığından emin değilim , ancak @ JohnW'un buradaki önerisine göre, bu anahtarın kaldırılması benim için de işe yarıyor.
David

4

AUTO_INCREMENT tablo tanımlarını oluşturan, varsayılan olarak --opt ile birlikte gelen --create-options'dır.

Yalnızca temel tabloları istiyorsanız,

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

Görünümler, tetikleyiciler ve rutinler de istiyorsanız,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
Bunun ayrıca tüm otomatik artış alanlarını drop table, karakter kümelerini vb.
Düşürdüğünü unutmayın

2

Bu gönderi sayesinde soruma cevap verebildim:

Veritabanımda sürüm kontrolünü nasıl yapabilirim?

Sonra şu komut dosyasını oluşturdum: db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

Sonra bunu crontab'e ekledim:

30 5 * * * sh /home/scripts/db_bkp.sh

Sonra depomda sonucu, db_structure.sqlgit'e ekledim ve değişiklikleri prod'a göndermeden önce, her zaman tüm dbs'de yapmayı unuttuğum yapısal değişiklikler olup olmadığını kontrol ederim.


-1

mysqldump -u [KULLANICI] -p [ŞİFRE] -d --skip-opt - tek işlem [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Bu ayrıca, yalnızca sondaki auto_increment değerini değil, etkinleştirildiği alanlardaki auto_increment bayrağını da kaldıracaktır.
Aquarion

--skip-optburada ve burada
Chris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.