HÃY THAM GIA VÀO BACKUPS VỚI mysqldump
IMHO Thực hiện sao lưu đã trở thành một hình thức nghệ thuật nếu bạn biết cách tiếp cận nó
Bạn có lựa chọn
Tùy chọn 1: mysqldump toàn bộ phiên bản mysql
Đây là cách dễ nhất, không có trí tuệ !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Mọi thứ được viết trong một tệp: cấu trúc bảng, chỉ mục, trình kích hoạt, thủ tục được lưu trữ, người dùng, mật khẩu được mã hóa. Các tùy chọn mysqldump khác cũng có thể xuất các kiểu khác nhau của lệnh INSERT, tệp nhật ký và tọa độ vị trí từ nhật ký nhị phân, tùy chọn tạo cơ sở dữ liệu, dữ liệu một phần (tùy chọn --where), v.v.
Tùy chọn 2: mysqldump cơ sở dữ liệu riêng biệt thành các tệp dữ liệu riêng biệt
Bắt đầu bằng cách tạo danh sách cơ sở dữ liệu (2 kỹ thuật để thực hiện việc này)
Kỹ thuật 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Kỹ thuật 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Kỹ thuật 1 là cách nhanh nhất. Kỹ thuật 2 là chắc chắn và an toàn nhất. Kỹ thuật 2 tốt hơn bởi vì, đôi khi, người dùng tạo các thư mục cho các mục đích chung trong / var / lib / mysql (datadir) không liên quan đến cơ sở dữ liệu. Information_schema sẽ đăng ký thư mục dưới dạng cơ sở dữ liệu trong bảng information_schema.schemata. Kỹ thuật 2 sẽ bỏ qua các thư mục không chứa dữ liệu mysql.
Khi bạn biên dịch danh sách cơ sở dữ liệu, bạn có thể tiến hành lặp qua danh sách và mysqldump chúng, thậm chí song song nếu muốn.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Nếu có quá nhiều cơ sở dữ liệu để khởi chạy cùng một lúc, song song kết xuất chúng 10 lần:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Tùy chọn 3: mysqldump các bảng riêng biệt thành các tệp dữ liệu riêng biệt
Bắt đầu bằng cách tạo một danh sách các bảng
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Sau đó kết xuất tất cả các bảng trong nhóm 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Tùy chọn 4: SỬ DỤNG HÌNH ẢNH CỦA BẠN
Hãy thử các biến thể của Tùy chọn đã nói ở trên cộng với các kỹ thuật để chụp nhanh
Ví dụ
- Sắp xếp danh sách các bảng theo kích thước của mỗi bảng tăng dần hoặc giảm dần.
- Sử dụng quy trình riêng biệt, chạy "BẢNG XÓA B READNG ĐỌC KHÓA; CHỌN SLEEP (86400)" trước khi khởi chạy mysqldumps. Giết quá trình này sau khi mysqldumps hoàn thành. Điều này hữu ích nếu cơ sở dữ liệu chứa cả InnoDB và MyISAM
- Lưu mysqldumps trong các thư mục ngày và xoay ra các thư mục sao lưu cũ.
- Tải toàn bộ mysqldumps vào các máy chủ độc lập.
CẨN THẬN
Chỉ có lựa chọn 1 mang lại mọi thứ. Hạn chế là mysqldumps được tạo theo cách này chỉ có thể được tải lại vào cùng một phiên bản phát hành chính của mysql mà mysqldump đã được tạo. Nói cách khác, một mysqldump từ cơ sở dữ liệu MySQL 5.0 có thể được tải trong 5.1 hoặc 5.5. Nguyên nhân ? Lược đồ mysql hoàn toàn khác nhau giữa các bản phát hành chính.
Tùy chọn 2 và 3 không bao gồm lưu tên người dùng và mật khẩu.
Đây là cách chung để kết xuất SQL Grants cho người dùng dễ đọc và dễ mang theo hơn
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
Tùy chọn 3 không lưu các thủ tục được lưu trữ, vì vậy bạn có thể làm như sau
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Một điểm khác cần lưu ý là liên quan đến InnoDB. Nếu bạn có một vùng đệm InnoDB lớn, sẽ rất hợp lý khi xóa nó tốt nhất có thể trước khi thực hiện bất kỳ bản sao lưu nào. Mặt khác, MySQL dành thời gian để xóa các bảng với trang bẩn còn sót lại khỏi vùng đệm. Đây là những gì tôi đề nghị:
Khoảng 1 giờ trước khi thực hiện sao lưu chạy lệnh SQL này
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Trong MySQL 5.5 mặc định innodb_max_denty_pages_pct là 75. Trong MySQL 5.1 trở lại, mặc định innodb_max_denty_pages_pct là 90. Bằng cách đặt innodb_max_dundred_pages_pct thành 0, điều này sẽ đẩy nhanh các trang bẩn vào đĩa. Điều này sẽ ngăn chặn hoặc ít nhất làm giảm tác động của việc dọn sạch mọi cam kết hai pha không hoàn chỉnh của dữ liệu InnoDB trước khi thực hiện bất kỳ mysqldump nào đối với bất kỳ bảng InnoDB nào.
CÔNG VIỆC CUỐI CÙNG TRÊN mysqldump
Hầu hết mọi người né tránh mysqldump để ủng hộ các công cụ khác và những công cụ đó thực sự tốt.
Những công cụ này bao gồm
- MAATKIT ( tập lệnh kết xuất / khôi phục song song , từ Percona [Không dùng nữa nhưng tuyệt vời])
- XtraBackup (Sao lưu ảnh chụp nhanh TopNotch từ Percona)
- CDP R1Soft ( Tùy chọn mô-đun MySQL chụp ảnh nhanh theo thời gian)
- Sao lưu doanh nghiệp MySQL (trước đây là Sao lưu nóng InnoDB [thương mại])
Nếu bạn có tinh thần của một DBA MySQL thực sự, bạn có thể nắm lấy mysqldump và hoàn toàn làm chủ được nó có thể đạt được. Có thể tất cả các bản sao lưu của bạn là sự phản ánh các kỹ năng của bạn như là một DBA của MySQL .