Các cài đặt mysqldump tối ưu là gì? [đóng cửa]


14

Sau một số tìm kiếm, tôi đã kết thúc với các cài đặt sau:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Cho đến nay rất tốt nhưng tôi có một số câu hỏi liên quan đến các tham số cũng như việc thực hiện.

Về mối quan tâm đầu tiên của tôi, tôi chỉ muốn đảm bảo rằng tất cả chúng đều được yêu cầu và không gây ra bất kỳ xung đột nào khi được sử dụng cùng nhau. Cuối cùng, tôi muốn tạo một tệp kết xuất rất mạnh mẽ và nhất quán, với hàng triệu bản ghi, tạo các bảng, cơ sở dữ liệu và chèn dữ liệu. Điều tốt là làm cho cơ sở dữ liệu không có sẵn trong một thời gian không phải là vấn đề đối với tôi. Mục tiêu duy nhất của tôi là tạo ra một tệp kết xuất mạnh mẽ và nhất quán.

Về buổi hòa nhạc thứ hai của tôi, tôi muốn biết làm thế nào để được thông báo khi đó lệnh sai và nếu vậy hãy ném một ngoại lệ.

Có ý kiến ​​gì không?

BIÊN TẬP

Đây là lệnh mysqldump được cập nhật của tôi dựa trên phản hồi của RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql

Đọc từng đối số và lợi ích của nó và chọn cái nào sẽ phù hợp với bạn. Cũng nhận biết kịch bản để kích hoạt thất bại.
Mannoj

Mát mẻ. Nhưng điều này không thực sự trả lời câu hỏi của tôi. Chẳng hạn, bạn luôn sử dụng cái nào trong số chúng?
dùng706838

Tha thứ cho sự thiếu hiểu biết của tôi, câu hỏi này không phải là về việc giới thiệu một cuốn sách hoặc một trang web. Vì vậy, tôi nghĩ rằng nó không nên là loại câu hỏi dựa trên ý kiến. Điều đó đã được nói rằng một số câu trả lời chắc chắn sẽ có chất lượng hơn tùy thuộc vào chuyên môn và được hỗ trợ bởi các bài kiểm tra. Theo tôi, câu hỏi được nêu hoàn hảo với một mục tiêu được xác định rõ.
dùng10089632

Câu trả lời:


30

Bạn sẽ thấy điều này gây sốc, nhưng bạn chỉ cần một lựa chọn chính: --opt

--Opt là gì?

Tùy chọn này, được bật theo mặc định, là tốc ký cho sự kết hợp của --add-drop-table --add-lock --create-Tùy chọn --disable-key --extends-insert --lock- frames --quick - bộ ký tự . Nó cung cấp một hoạt động kết xuất nhanh và tạo ra một tệp kết xuất có thể được tải lại vào máy chủ MySQL một cách nhanh chóng.

tùy chọn - -opt được bật theo mặc định , bạn chỉ chỉ định nghịch đảo của nó, --skip-opt để tắt một số cài đặt mặc định. Xem thảo luận về các nhóm tùy chọn mysqldump để biết thông tin về việc bật hoặc tắt một tập hợp con các tùy chọn bị ảnh hưởng bởi --opt.

--opt đã được bật, bạn không cần chỉ định --opt . Mặc dù vậy, bạn có thể cần một số tùy chọn cần thiết không được bao gồm.

Chạy truy vấn này trên cơ sở dữ liệu của bạn

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Nếu bạn có tất cả các bảng InnoDB, thì bạn cần chỉ định - giao dịch đơn lẻ . Điều này sẽ tự động hủy kích hoạt --lock-bảng và cho phép bạn kết xuất tất cả các bảng trong cùng một thời điểm và cho phép ghi mới đến cùng một lúc.

Nếu bạn có một hoặc nhiều bảng MyISAM, thì bạn cần chỉ định --lock-all-bảng . Điều này sẽ tự động hủy kích hoạt --lock-bảng , hủy kích hoạt --single-giao dịch , khóa tất cả các bảng trên tất cả các cơ sở dữ liệu, sau đó tạo kết xuất. Việc ghi vào bảng InnoDB vẫn có thể xảy ra, nhưng chúng sẽ chỉ được xếp hàng cho đến khi các khóa được giải phóng. Bất kỳ kết nối DB nào đang cố ghi vào bất kỳ bảng MyISAM nào sẽ thực sự bị treo cho đến khi tất cả các khóa được giải phóng.

Chạy truy vấn này: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Nếu Number_Of_Stored_Procedureslớn hơn 0, sử dụng --routines .

Chạy truy vấn này: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Nếu Number_Of_Triggerslớn hơn 0, sử dụng --triggers .

CAVEAT : Vui lòng không sử dụng - order-by-sơ cấp để hủy tất cả các cơ sở dữ liệu vì nó có khả năng làm cho các chỉ mục BTREE thay vì bị mất khi tải lại. --order-by-sơ cấp chỉ nên được sử dụng khi kết xuất một bảng riêng lẻ mà bạn biết có khóa chính nguyên và sẽ có nhiều lần quét phạm vi từ ứng dụng của bạn.

Nếu bạn cần các loại sao lưu mysqldump sáng tạo hơn, hãy xem bài viết cũ của tôi Làm thế nào tôi có thể tối ưu hóa một mysqldump của một cơ sở dữ liệu lớn? .

Xin vui lòng đọc tất cả các tùy chọn cho mysqldump .

CẬP NHẬT 2014-12-29 09:44 EST

Tôi đã cập nhật lệnh mysqldump của mình (vui lòng xem chỉnh sửa của tôi). Tôi có một câu hỏi cuối cùng mặc dù. Bạn có nghĩ rằng nó cũng có giá trị sử dụng tất cả các đối số sau đây không? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Nhìn vào bình luận của bạn và chỉnh sửa mới nhất của bạn, hãy xem từng tùy chọn này và xem bạn có cần bất kỳ tùy chọn nào không

  • --opt : Tôi đã nói rằng bạn không cần chỉ định nó vì nó được bật theo mặc định.
  • --delayed-insert : Tôi cố tình tránh xa điều này với cơ sở dữ liệu InnoDB. Trên thực tế, tôi kiên quyết tránh xa GIAI ĐOẠN này !!! . Vì 1) có thể INSERT DELAYED có thể mất dữ liệu, 2) nó được chuyển đổi thành INSERT cho nô lệ tái tạo MySQL, 3) có một báo cáo lỗi mở về việc sử dụng nó với các trình kích hoạt trở lại trong MySQL 5.6 và không được coi là lỗi , 4 ) nó không được chấp nhận trong MySQL 5.6 và 5) Morgan Tocker (Chuyên gia MySQL nổi tiếng) đã thấy trước sự phản đối của nó vào năm 2012 , bạn nên quên tùy chọn này từng tồn tại. Đừng bao giờ, bao giờ (vô cùng) sử dụng nó !!!
  • --complete-insert : Cái này sẽ sử dụng INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...thay cho INSERT INTO tblname VALUES .... Điều này có thể làm tăng mysqldump nếu có nhiều cột trong định nghĩa bảng và nhiều hàng trong bảng. Đừng sử dụng nó.
  • --add-drop-table : Vì --opt kích hoạt nó cho bạn, bạn không cần chỉ định nó.
  • --add-drop-database : Nếu bạn thả --add-drop-database , nó chỉ làm cho DROP TABLE IF EXISTS(được thêm bởi --add-drop-table ) đi nhanh hơn. Không sử dụng nó chỉ đơn giản là cho phép DROP TABLE IF EXISTSxảy ra cho mỗi bảng. Vì vậy, sử dụng --add-drop-cơ sở dữ liệu là vấn đề lựa chọn cá nhân.
  • --tz-utc : Nếu bạn có kế hoạch khôi phục dữ liệu cho cùng một máy chủ mà bạn sao lưu từ đó, bạn không cần --tz-utc . Nếu bạn khôi phục dữ liệu sang trung tâm dữ liệu khác theo múi giờ khác và ...
    • nếu bạn muốn giữ cùng múi giờ bạn sao lưu, bạn không cần --tz-utc .
    • nếu bạn muốn dữ liệu sử dụng múi giờ của một trung tâm dữ liệu mới, bạn cần --tz-utc .
    • VÍ DỤ: Giả sử bạn sao lưu cơ sở dữ liệu ở New York. Đó là EST. Nếu bạn có một trung tâm dữ liệu khác ở Seattle, đó sẽ là PST. Nếu bạn muốn Sao lưu New York được khôi phục ở Seattle và bạn muốn dấu thời gian trong cơ sở dữ liệu vẫn đại diện cho New York, bạn không muốn sử dụng --tz-utc .
  • --default-character-set

Điều chỉnh chỉnh sửa mới nhất của bạn, đây là điều bạn đặc biệt cần

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Một lần nữa, tôi nói xin vui lòng đọc tất cả các tùy chọn cho mysqldump .


Giới thiệu về --add-drop-database: không phải điều này cũng đảm bảo không có bất kỳ bảng ngẫu nhiên nào khác trong cơ sở dữ liệu của bạn không có trong kết xuất của bạn? Nếu ai đó tự tạo một bảng thử nghiệm ngẫu nhiên trong cơ sở dữ liệu của bạn, thì nó vẫn tồn tại sau khi tải lại từ bãi chứa mà không có tùy chọn này. Vì vậy, nó phụ thuộc vào việc bạn muốn điều đó hay không. Đúng?
jschultz410

Thế còn --add-drop-trigger?
lonix
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.