mysqldump - Chỉ xuất cấu trúc mà không có autoincrement


87

Tôi có một cơ sở dữ liệu MySQL và tôi đang cố gắng tìm cách chỉ xuất cấu trúc của nó mà không có các giá trị tăng tự động. mysqldump --no-datahầu như sẽ thực hiện công việc, nhưng nó vẫn giữ các giá trị auto_increment. Có cách nào để làm điều đó mà không cần sử dụng PHPMyAdmin (mà tôi biết nó có thể làm được) không?


Có vẻ như với MySQL 5.5 (máy chủ), --no-datasẽ bỏ qua các giá trị auto_increment theo mặc định.
Joey Adams

@JoeyAdams bạn có chắc không? Đó không phải là kinh nghiệm hành vi của tôi
Aland

2
@JoeyAdams MySQL 5.7. * Của mysqldump không bỏ qua auto_increment khi sử dụng --no-data.
Tiberiu-Ionuț Stan,

Câu trả lời:


68

Bạn có thể làm được việc này :

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

Như những người khác đã đề cập, Nếu bạn muốn sedhoạt động bình thường, hãy thêm thông số g(cho g lobal Replace) như sau:

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

(điều này chỉ hoạt động nếu bạn đã cài đặt Công cụ GUI mysqldump --skip-auto-increment:)

CẬP NHẬT mới nhờ nhận xét.

Điều \bnày là vô ích và đôi khi sẽ phá vỡ lệnh. Xem chủ đề SO này để giải thích. Vì vậy, câu trả lời được tối ưu hóa sẽ là:

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

11
Tôi không nghĩ đó --skip-auto-incrementlà một lựa chọn thực sự. Tôi không thể tìm thấy nó trong tài liệu . Cả hai lỗi MySQL cho vấn đề này đều không đề cập đến nó: 20786 , 30957 . Phiên bản nào của mysqldump có tùy chọn này?
Rich

1
--skip-auto-incrementlà một tùy chọn được thêm vào MySQL GUI Tools nếu bạn nhớ chính xác. (không chắc lắm ^^) Vì vậy trên thực tế nó không hẳn là một giải pháp! Nhưng lệnh nội tuyến thứ hai là chính xác, tôi đã thành lập nó ở đây , nơi chủ đề nói về vấn đề autoincrement và cung cấp ý tưởng sedlọc!
JoDev

4
Tùy chọn Sed sẽ không loại bỏ tất cả các số tự động nếu bạn xuất nhiều bảng, chỉ bảng cuối cùng. Ngoài ra, --skip-auto-increment không phải là một tùy chọn hiện có. Làm thế nào mà câu trả lời này lại được đánh giá cao như vậy?
Lex

3
bạn cần ag ở cuối lệnh sed: sed 's /.../.../ g' để thay thế tất cả các lần xuất hiện.
p91paul

Lệnh này không đúng. --skip-auto-increment không tồn tại. Regex không đúng. Như p91paul đã lưu ý rằng công cụ sửa đổi g cần được thêm vào để thay thế tất cả các lần xuất hiện. Sử dụng giải pháp @JohnW để thay thế.
Aalex Gabi

52

Câu trả lời của JoDev hoạt động hoàn hảo đối với tôi với một điều chỉnh nhỏ đối với biểu thức chính quy sed:

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

1
Vâng, tôi không chắc điều đó có tác dụng gì \btrong câu lệnh sed, nhưng theo gợi ý của @ JohnW ở đây, việc loại bỏ công tắc đó cũng có lợi cho tôi.
David

4

Nó là --create-options, được bao gồm trong --opt, theo mặc định, tạo ra các định nghĩa bảng AUTO_INCREMENT.

Nếu bạn chỉ muốn các bảng cơ sở,

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

Nếu bạn cũng muốn lượt xem, trình kích hoạt và quy trình,

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

3
Lưu ý rằng điều này cũng làm giảm bất kỳ trường, drop tables, bộ ký tự tăng tự động nào , v.v.
Deanna

2

Nhờ bài đăng này, tôi đã có thể trả lời câu hỏi của mình:

Làm cách nào để kiểm soát phiên bản trên db của tôi?

Sau đó, tôi vừa tạo tập lệnh này: 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"

Sau đó, tôi thêm điều này vào crontab:

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

Sau đó, trong repo của mình, tôi đã thêm kết quả, db_structure.sqlvào git và trước khi đẩy các thay đổi vào prod, tôi luôn kiểm tra xem có bất kỳ thay đổi cấu trúc nào mà tôi quên thực hiện trên tất cả các dbs hay không.


-1

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


6
Điều này cũng sẽ xóa cờ auto_increment trên các trường mà nó được bật, không chỉ giá trị auto_increment ở cuối.
Aquarion

--skip-optthảo luận ở đâyở đây.
Chris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.