mysqldump - Ekspor struktur hanya tanpa autoincrement


88

Saya memiliki database MySQL dan saya mencoba menemukan cara untuk mengekspor strukturnya saja, tanpa nilai kenaikan otomatis. mysqldump --no-datahampir melakukan tugasnya, tetapi mempertahankan nilai auto_increment. Apakah ada cara untuk melakukannya tanpa menggunakan PHPMyAdmin (yang saya tahu bisa melakukannya)?


Sepertinya dengan MySQL 5.5 (server), --no-dataakan menghilangkan nilai auto_increment secara default.
Joey Adams

@ JoeyAdams apakah kamu yakin? Itu bukanlah perilaku yang saya alami
aland

2
@JoeyAdams MySQL 5.7. * Mysqldump tidak menghilangkan auto_increment saat menggunakan --no-data.
Stan Tiberiu-Ionuț

Jawaban:


70

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 sedkarya dengan benar, tambahkan g(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 \bada 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

11
Saya pikir itu bukan --skip-auto-incrementpilihan 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?
Kaya

1
--skip-auto-incrementadalah 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 tentang sedpemfilteran!
JoDev

4
Opsi Sed tidak akan menghapus semua penambahan otomatis jika Anda mengekspor beberapa tabel, hanya yang terakhir. Selain itu, --skip-auto-increment bukanlah opsi yang ada. Bagaimana jawaban ini bisa dinilai begitu tinggi?
Lex

3
Anda membutuhkan ag di akhir perintah sed Anda: sed 's /.../.../ g' untuk mengganti semua kemunculan.
hal91paul

Perintah ini salah. --skip-auto-increment tidak ada. Regex salah. Seperti yang dicatat p91paul, pengubah g perlu ditambahkan untuk mengganti semua kejadian. Gunakan solusi @JohnW sebagai gantinya.
Aalex Gabi

52

Jawaban JoDev bekerja dengan sempurna untuk saya dengan sedikit penyesuaian pada ekspresi reguler sed:

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

1
Ya, saya tidak yakin apa \bfungsinya dalam pernyataan sed, tetapi sesuai saran @ JohnW di sini, penghapusan sakelar itu juga bermanfaat bagi saya.
David

4

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

3
Perhatikan bahwa ini juga menghilangkan bidang kenaikan otomatis, drop tables, kumpulan karakter, dll.
Deanna

2

Berkat postingan ini, saya bisa menjawab pertanyaan saya:

Bagaimana saya bisa melakukan kontrol versi pada db 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:

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

Kemudian di repo saya, saya menambahkan hasilnya, db_structure.sqlke git dan sebelum mendorong perubahan ke prod saya selalu memeriksa apakah ada perubahan struktural yang saya lupa lakukan pada semua dbs.


-1

mysqldump -u [PENGGUNA] -p [PASSWORD] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Ini juga akan menghapus tanda auto_increment pada bidang yang mengaktifkannya, bukan hanya nilai auto_increment di akhir.
Aquarion

--skip-optdibahas di sini dan di sini.
Chris
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.