Xác minh sao lưu mysqldump là tham nhũng miễn phí


7

Chúng tôi đã có một tác vụ cron sao lưu Cơ sở dữ liệu của chúng tôi bằng cách sử dụng mysqldump- mối quan tâm chính của tôi là tham nhũng, thiếu nhập thủ công và kiểm tra các bản sao lưu mỗi khi cách tốt nhất để kiểm tra / xác minh bản sao lưu là không tham nhũng?

Bối cảnh: Chúng tôi đang chạy mysql 5.5. * Và InnoDB. Chúng tôi đang chạy mysqldumpthẳng từ máy chủ. Chúng tôi hiện không sử dụng master / Slave hoặc master / master nhưng có thể thay đổi nếu nó có ích. DB hiện tại nhỏ <1mb, nó sẽ <50mb trong tương lai gần, do đó, quy mô thực sự cần phải được tính đến trong trường hợp này.

Câu trả lời:


4

Cách tốt nhất để xác minh bản sao lưu là khôi phục cơ sở dữ liệu từ nó.

Một lý do khác để làm như vậy là giảm thời gian khôi phục.


4

Có hai điều bạn muốn xem xét

QUY TRÌNH SAU

Thực sự không có thay thế cho việc khôi phục. Đây chỉ là một phát lại của một mysqldump. Nếu bạn cần làm PITR , bạn có thể cần chạy mysqlbinlog với các binlog hiện hành và phát các sự kiện đến ngày và thời gian cần thiết.

Bạn nên thực hiện việc này định kỳ trong trường hợp đĩa có vị trí mysqldump bị hỏng hoặc nếu mysqldump chứa một chuỗi các ký tự trong BLOB khiến cho không thể khôi phục.

TÍCH HỢP SAU

Bạn sẽ có thể bắt đầu mysqld mà không gặp vấn đề gì. Khi bạn đã chạy mysqld, bạn cần kiểm tra khả năng sử dụng của từng bảng. Bạn có thể làm điều đó bằng cách chạy truy vấn này:

SELECT CONCAT('CHECK TABLE ',dbtb,';') FROM
(SELECT CONCAT(table_schema,'.',table_name) dbtb FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

Điều này sẽ tạo lệnh CHECK TABLE cho mọi bảng MyISAM, InnoDB, ARCHIVE và CSV để kiểm tra tính toàn vẹn của chúng. Bạn có thể xuất tập lệnh này thành tập lệnh và thực thi tập lệnh. Lệnh CHECK TABLE cũng có thể cho phép bạn kiểm tra tất cả các bảng dưới dạng một lệnh. Bạn có thể thay đổi truy vấn để thu thập tên bảng dưới dạng danh sách và dấu phụ được phân tách bằng dấu phẩy:

SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
(SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

CẢNH BÁO: Các GROUP_CONCAT()chức năng có một giới hạn mặc định là 1024 ký tự. Nếu bạn có số lượng bảng khiêm tốn, bạn sẽ không liệt kê tất cả các bảng và bảng cuối cùng được liệt kê sẽ bị cắt, gây ra lỗi. Bạn có thể mở đầu lệnh của bạn SET SESSION group_concat_max_len = 10000;để tăng thời gian hoàn trả.

Đây là một mẫu từ MySQL 5.6.16 (Windows) trên máy tính xách tay của tôi:

mysql> SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
    -> (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
    -> information_schema.tables WHERE table_schema NOT IN
    -> ('information_schema','performance_schema','mysql')) A;
+----------------------------------------------------------------------------+
| CONCAT('CHECK TABLE ',dbtblist,';')                                        |
+----------------------------------------------------------------------------+
| CHECK TABLE ayman.articles,ayman.topics,test.nuoji,test.prod,test.prodcat; |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>

Sau đó, lưu trữ đầu ra đó vào một biến và thực hiện từ dòng lệnh. Lưu ý rằng chúng tôi đã tạm thời tăng group_concat_max_lentrước khi chạy lệnh.

MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET SESSION group_concat_max_len = 1048576;"
SQL="${SQL} SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM"
SQL="${SQL} (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM"
SQL="${SQL} information_schema.tables WHERE table_schema NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')) A"
mysql ${MYSQL_CONN} -ANe"${SQL}" | mysql ${MYSQL_CONN}

Hãy thử một lần !!!


Độ dài tối đa của kết quả của hàm GROUP_CONCAT () là 1024 ký tự. Nếu bạn có nhiều bảng, nó sẽ không nhận được tất cả các bảng và rất có thể tên bảng cuối cùng được in sẽ bị cắt. Bạn muốn SET SESSION group_concat_max_len = 10000;trước lệnh.
jnovack

@jnovavk cảm ơn bạn đã nắm bắt điều đó. Tôi đã tìm hiểu về group_concat_max_len sau đó và đưa nó vào bài viết sau của tôi. Xem dba.stackexchange.com/ . Tôi vừa đổi 10000 thành 1048576. Một lần nữa, cảm ơn bạn vì con mắt đại bàng của bạn.
RolandoMySQLDBA

1

Một cách tiếp cận tôi làm theo để thống nhất mysqldump bình thường

Viết một tập lệnh shell trong luồng được đề cập bên dưới và lưu nó dưới dạng "mysqlbackup.sh"

  • Trên thầy

! # / usr / bin / bash

  • Spool các tên cơ sở dữ liệu trong vòng lặp FOR và tạo .sqls của riêng chúng như db1.sql

  • mysqldump -uroot -pPASSWORD - giao dịch đơn lẻ "db1"> /backup/mysql/TODAY_DATE/db1.sql

  • cd / sao lưu / mysql /

  • tar -czvf TODAY_DATE.tar.gz TODAY_DATE # thư mục Tar Gun Zip

  • gzip -t /backup/mysql/TODAY_DATE.tar.gz # Để kiểm tra tính toàn vẹn của gzip

  • scp /backup/mysql/TODAY_DATE.tar.gz gửi đến một máy chủ khác # Đặt hàng để khắc phục lỗi cấp độ máy chủ vì một điểm tối thiểu của lỗi hoặc lưu trữ trong SAN hoặc ghép kênh tùy thuộc vào mức độ thất bại của bạn có thể là cấp độ trung tâm dữ liệu, Cấp độ mạng, v.v. .,

  • Dọn dẹp và xoay các bản sao lưu cũ trong thời gian lưu giữ 7 ngày (Tùy theo nhu cầu của bạn để khôi phục từ máy chủ cục bộ)

crontab -l

00 3 * * * /usr/scripts/mysqlbackup.sh 2> / usr / scripts / log_mysqlbackup. date +%Y_%m_%d_M.err

Theo dõi nagios hoặc netcool của bạn để trỏ đến tệp / usr / scripts / log_mysqlbackup. date +%Y_%m_%d_M.err

err_file="/usr/scripts/log_mysqlbackup.`date +%Y_%m_%d_M`.err "

if [[ -s $err_file ]]
then
"Trigger alert -> Alerting team should call DB Team to fix it by rerunning backup"
fi
  • Bạn có thể thêm các tiêu chí kiểm tra khác để kích hoạt cảnh báo như, kích thước của tệp sao lưu phải lớn hơn 3 GB (tùy thuộc vào kích thước sao lưu tiêu chuẩn bạn nhận được) và kích hoạt cảnh báo nếu nó nhỏ hơn, v.v. Phân tích các tiêu chí này trong mysqlbackup.sh và khắc phục các vấn đề trong việc xác định các tiêu chí của bạn sau đó >> viết chi tiết trong / usr / scripts / log_mysqlbackup. date +%Y_%m_%d_M.err. Vì công cụ giám sát sẽ kích hoạt cảnh báo nếu tập tin err có kích thước trong đó.

  • Vì bạn có tệp master-binlog và master-binlog-vị trí được ghi trong sqldump, sẽ hữu ích trong trường hợp PITR nếu bạn có tệp nhật ký nhị phân sau này để áp dụng.

Kiểm tra cấp độ khác:

  • Mỗi tháng một lần, bạn có thể thử khôi phục mọi bản sao lưu ngẫu nhiên từ tất cả các thiết bị ghép kênh (ví dụ: máy chủ cục bộ / máy chủ bên ngoài / SAN / băng).

Điều này đảm bảo tính nhất quán dữ liệu sao lưu của bạn và có thể tránh các tình huống dữ liệu sao lưu không hợp lệ tại thời điểm khôi phục khẩn cấp.


0

Bạn nên nhớ rằng một kết xuất MySQL về cơ bản là một tệp văn bản SQL lớn tạo ra lược đồ (các) cơ sở dữ liệu và chèn tất cả dữ liệu vào đó. Vì vậy, một khi mysqldump thoát chính xác, bạn có thể chắc chắn rằng mọi thứ đều ổn (giả sử tất nhiên là bạn đang sao lưu cơ sở dữ liệu chính xác!)

Tôi không biết bất kỳ cách nào một tệp mysqldump có thể bị hỏng (trừ khi có vấn đề về hệ thống tệp, trong trường hợp đó, bất kỳ tệp nào cũng có thể được xử lý). MySQL là (đúng) khá khó hiểu về nó; nếu có một số bảng bị hỏng trong cơ sở dữ liệu, mysqld sẽ bị sập và không cho phép mysqldump chấm dứt, để bảo vệ tính toàn vẹn của cơ sở dữ liệu.

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.