Saya memiliki database MySQL dan saya mencoba menemukan cara untuk mengekspor strukturnya saja, tanpa nilai kenaikan otomatis. mysqldump --no-data
hampir melakukan tugasnya, tetapi mempertahankan nilai auto_increment. Apakah ada cara untuk melakukannya tanpa menggunakan PHPMyAdmin (yang saya tahu bisa melakukannya)?
88
--no-data
akan menghilangkan nilai auto_increment secara default.Jawaban:
Kamu bisa melakukan ini :
mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql
Seperti yang disebutkan oleh orang lain, Jika Anda ingin
sed
karya dengan benar, tambahkang
(untuk g pengganti lobal) parameter seperti ini:mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql
(ini hanya berfungsi jika Anda menginstal Alat GUI:
mysqldump --skip-auto-increment
)PEMBARUAN baru berkat komentar.
Tidak
\b
ada gunanya dan terkadang akan melanggar perintah. Lihat topik SO ini untuk penjelasannya. Jadi jawaban yang dioptimalkan adalah:mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql
sumber
--skip-auto-increment
pilihan nyata. Saya tidak dapat menemukannya di dokumentasi . Baik dari dua bug MySQL untuk masalah ini menyebutkan: 20.786 , 30.957 . Versi mysqldump manakah yang memiliki opsi ini?--skip-auto-increment
adalah opsi yang ditambahkan di Alat GUI MySQL jika diingat dengan benar. (tidak yakin ^^) Jadi sebenarnya ini bukan solusi! Tetapi perintah inline kedua benar, saya menemukannya di sini di mana topiknya berbicara tentang masalah autoincrement , dan memberikan ide tentangsed
pemfilteran!Jawaban JoDev bekerja dengan sempurna untuk saya dengan sedikit penyesuaian pada ekspresi reguler sed:
sumber
\b
fungsinya dalam pernyataan sed, tetapi sesuai saran @ JohnW di sini, penghapusan sakelar itu juga bermanfaat bagi saya.Ini adalah --create-options, yang disertakan dengan --opt, secara default, yang menghasilkan definisi tabel AUTO_INCREMENT.
Jika Anda hanya menginginkan tabel dasar,
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
Jika Anda juga menginginkan tampilan, pemicu, dan rutinitas,
mysqldump -hlocalhost -uuser -ppass \ --skip-opt --events --routines --no-data \ schemaname
sumber
drop table
s, kumpulan karakter, dll.Berkat postingan ini, saya bisa menjawab pertanyaan saya:
Lalu saya baru saja membuat skrip ini:
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"
Lalu saya menambahkan ini ke crontab:
Kemudian di repo saya, saya menambahkan hasilnya,
db_structure.sql
ke git dan sebelum mendorong perubahan ke prod saya selalu memeriksa apakah ada perubahan struktural yang saya lupa lakukan pada semua dbs.sumber
mysqldump -u [PENGGUNA] -p [PASSWORD] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
sumber
--skip-opt
dibahas di sini dan di sini.