MySQL備份方案-->(利用mysqldump以及binlog二進制日志)


MySQL備份方案-->(利用mysqldump以及binlog二進制日志)

 

隨着數據不斷增加,而且為了兼容以后的innodb存儲引擎, 所以考慮采用mysqldump全備+日志增量備份的策略。使用mysqldump對於mysql大部分mysql存儲引擎比如myisam、innodb都有很好的支持。

 

方案一:mysqldump全備份+日志增量備份

1, mysqldump備份方案:

周一凌晨3點全備

周二到周日凌晨3點增量備份

 

2, 備份步驟

(1)     創建備份目錄,備份腳本存放目錄

Shell > mkdir /usr/mysqlbackup;

Shell > chmod 755 /usr/mysqlbackup;

Shell > mkdir /usr/mysqlbackup/daily;

Shell > chmod 755 /usr/mysqlbackup/daily;

Shell > mkdir /usr/script;

Shell > chmod 777 /usr/script/*.sh

 

(2)     啟用二進制日志

如果日志沒有啟開,必須啟用binlog,要重啟mysqld,首先,關閉mysqld,打開/etc/my.cnf,加入以下幾行:

[mysqld]

log-bin

然后重新啟動mysqld,會產生hostname-bin.000001以及hostname-bin.index,前面的日志文件是記錄所有對數據的更新操作,后面的文件是存儲所有二進制文件的索引,不能輕易被刪除。

 

(3)     全備份,增量備份。

詳細見mysqlFullBackup.sh、mysqlDailyBackup.sh腳本(請注意腳本里面的備份目錄、mysql軟件安裝目錄、壓縮文件名以及用戶名密碼,如有不符,請修改)。

下面是部分shell上單個手動執行的測試命令。

Shell> /usr/local/mysql/bin/mysqldump -uroot-pnYuIman25040slave201012301124 --no-create-info=FALSE --order-by-primary=FALSE--force=FALSE --no-data=FALSE --tz-utc=TRUE --flush-privileg

es=FALSE --compress=FALSE --replace=FALSE--insert-ignore=FALSE --extended-insert=TRUE --quote-names=TRUE --hex-blob=TRUE--complete-insert=FALSE --add-locks=TRUE --port=3306 --d

isable-keys=TRUE --delayed-insert=FALSE--create-options=TRUE --delete-master-logs=FALSE --comments=TRUE--default-character-set=utf8 --max_allowed_packet=1G --flush-logs=FALSE -

-dump-date=TRUE --lock-tables=TRUE--allow-keywords=FALSE --events=FALSE --single-transaction=TRUE --routines--all-databases > /backup/mysql/full/mysql_20110104_195546.sql

 

(4)    設置crontab任務,每天執行備份腳本

shell> crontab –e

#每個星期日凌晨3:00執行完全備份腳本

0 3 * * 0 /usr/scrpit/mysqlFullBackup.sh>/dev/null 2>&1

#周一到周六凌晨3:00做增量備份

0 3 * * 1-6/root/MySQLBackup/mysqlDailyBackup.sh >/dev/null 2>&1

(5)    清除舊的備份文件。

每天去看查看下備份磁盤空間,刪除舊的備份壓縮文件。

3, 數據庫恢復

 

【注釋】如果增量恢復操作中報“ERROR 1051 (42S02) at line 32: Unknown table 'fin_cell_attr_his'”類似的錯誤,則需要現create一張空表,然后再執行增量恢復。

Mysql> createtable tb1 ……;

 

(1)    全恢復:

用 mysqldump 備份出來的文件是一個可以直接倒入的 SQL 腳本,直接用 mysql命令恢復最后一次全備份:

先從備份文件服務器上copy出來,解壓縮,再恢復,例如:

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_20101216_231900.sql.tar.gz /usr/mysqlrestore/

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_binlog_20101217_030100.tar.gz /usr/mysqlrestore/

Shell>cd /usr/mysqlrestore/

Shell>tar -xvf mysql_20101216_231900.sql.tar.gz

Shell>tar -xvf mysql_binlog_20101217_030100.tar.gz

 

刷新日志:

Mysql>flush logs;

恢復最后一次全備份命令:

Shell>/usr/local/mysql/bin/mysql -uroot -p123456 </tmp/mysqlbackup/backup_20101215_adb.sql  

恢復最后一次全備份之后的所有增量備份命令:

Shell>/usr/local/mysql/bin/mysqlbinlog mysql-bin.00007 mysql-bin.00008mysql-bin.00009 mysql-bin.00010 mysql-bin.00011 | mysql

檢查:查看數據庫結構以及數據。

 

(2)    基於時間點恢復一,當天全備份之后的insert點數據故障誤操作:

如果上午全備份之后的insert數據被誤刪除, 在11點發生了誤操作.可以直接用bin-log日志將數據庫恢復到11點之前的那一刻,然后跳過故障時間點11點,再進行恢復下面所有的操作,命令如下:

刷新日志:

Mysql>flush logs;

先從備份文件服務器上把binlog日志copy出來,解壓縮。

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_binlog_20101221_030100.tar.gz  /usr/mysqlrestore/

Shell>cd /usr/mysqlrestore/

Shell>tar -xvf mysql_binlog_20101221_030100.tar.gz

日志增量恢復到故障點之前

Shell>/usr/local/myql/bin/mysqlbinlog --stop-date="2010-12-21 10:59:59" mysql-bin.00011|mysql -u root -p 123456
跳過故障的時間點,繼續執行后面的binlog,完成恢復
Shell> /usr/local/myql/bin/mysqlbinlog--start-date="2010-12-21 10:59:59" mysql-bin.00011| mysql -u root -p 123456

檢查:

用select * from tb等sql命令查看表以及數據是否恢復。

(3)    基於時間點恢復二,當天11點數據故障誤操作:

如果上午全備份之后的insert數據被誤刪除, 在11點發生了誤操作.丟失的數據是最后一次備份之前錄入的數據,則必須先用全備份文件進行全恢復,然后可以用bin-log日志將數據庫恢復到11點之 前的那一刻,然后跳過故障時間點11點,再進行恢復下面所有的操作,步驟過程如下:

刷新日志:

Mysql>flush logs;

先從備份文件服務器上copy出來,解壓縮,再恢復

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/mysql_20101216_231900.sql.tar.gz /usr/mysqlrestore/

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_binlog_20101217_030100.tar.gz  /usr/mysqlrestore/

Shell>cd /usr/mysqlrestore/

Shell>tar -xvf mysql_20101216_231900.sql.tar.gz

Shell>tar -xvf mysql_binlog_20101217_030100.tar.gz

恢復最后一次全備份命令:

Shell>/usr/local/mysql/bin/mysql -uroot -p123456 < /tmp/mysqlbackup/mysql_20101216_231900.sql

日志增量恢復到故障點之前

Shell>/usr/local/myql/bin/mysqlbinlog --stop-date="2010-12-21 10:59:59" mysql-bin.00011|mysql -u root -p 123456
跳過故障的時間點,繼續執行后面的binlog,完成恢復
Shell> /usr/local/myql/bin/mysqlbinlog--start-date="2010-12-21 10:59:59" mysql-bin.00011| mysql -u root -p 123456

檢查:

用select * from tb等sql命令查看表以及數據是否恢復。

 

(4)    基於時間點恢復三,昨天11點數據故障誤操作:

恢復流程,先全恢復,然后日志增量恢復跳過11點后繼續日志增量恢復,如下:

先從備份文件服務器上copy出來,解壓縮,再恢復

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/mysql_20101216_231900.sql.tar.gz /usr/mysqlrestore/

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_binlog_20101217_030100.tar.gz  /usr/mysqlrestore/

Shell>cd /usr/mysqlrestore/

Shell>tar -xvf mysql_20101216_231900.sql.tar.gz

Shell>tar -xvf mysql_binlog_20101217_030100.tar.gz

刷新日志:

Mysql>flush logs;

全恢復:

Shell>/usr/local/mysql/bin/mysql -uroot -p123456 < /tmp/mysqlbackup/ mysql_20101216_231900.sql

日志增量恢復到故障點:

Shell>/usr/local/myql/bin/mysqlbinlog --stop-date="2010-12-20 10:59:59" mysql-bin.00010|mysql -u root -p 123456

跳過故障點繼續恢復:

Shell>/usr/local/myql/bin/mysqlbinlog --start-date="2010-12-20 10:59:59" mysql-bin.00010mysql-bin.00011| mysql -u root -p 123456

 

(5)    基於時間點恢復四,多故障點恢復比如2個故障點數據故障誤操作:

第一個故障點:2010-12-2113:41:41 –> 2010-12-21 13:42:36

第二個故障點:2010-12-2113:43:16 –> 2010-12-21 13:46:05

恢復流程,先全恢復,然后日志增量恢復跳過第一個故障點后繼續日志增量恢復到第二個故障點,然后跳過第二個故障點繼續恢復到終點,如下:

先從備份文件服務器上copy出來,解壓縮,再恢復

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/mysql_20101216_231900.sql.tar.gz /usr/mysqlrestore/

Shell>/root/s3cmd/s3cmd get s3://csf-backup/mysqldb/ mysql_binlog_20101217_030100.tar.gz  /usr/mysqlrestore/

Shell>cd /usr/mysqlrestore/

Shell>tar -xvf mysql_20101216_231900.sql.tar.gz

Shell>tar -xvf mysql_binlog_20101217_030100.tar.gz

刷新日志:

Mysql>flush logs;

全恢復:

Shell>/usr/local/mysql/bin/mysql -uroot -p123456 < /tmp/mysqlbackup/ mysql_20101216_231900.sql

日志增量恢復到第一個故障點之前:

Shell>/usr/local/mysql/bin/mysqlbinlog --stop-date="2010-12-21 13:41:41"mysql-bin.000012| mysql -u root -p123456;

跳過故障點繼續恢復到第二個故障點之前:

Shell> /usr/local/mysql/bin/mysqlbinlog--start-date="2010-12-21 13:42:36" --stop-date="2010-12-2113:43:16"  mysql-bin.000012 mysql-bin.000013|mysql -u root -p123456;

       跳過第二個故障點恢復到flushlogs之時

      Shell>/usr/local/mysql/bin/mysqlbinlog --start-date="2010-12-21 13:46:05" --stop-date="2010-12-2113:46:33" mysql-bin.000012 mysql-bin.000013| mysql -u root -p123456;

檢查:運用sql語句查詢誤操作的表以及數據是否已經恢復。

(6)    恢復單一庫:

Shell>/usr/local/mysql/bin/mysql -uroot -pmysql --database=csf </tmp/mysqlbackup/backup_20101215_adb_003.sql

 

(7)    基於單庫中的各種時間點情況恢復:

請參考 以上步驟(1)(5),過程基本一樣,只要在恢復命令后面加上一個空格和庫名就可以了。

(8)    恢復單庫中的單張表:

Mysql所提供的工具目前無法做到這一步,有個方案是:先恢復整個庫到一個測試數據服務器上,然后在此服務器上導出單張表的sql,然后把這個sql導入進生產庫上。

在測試服務器上導入庫:

Shell>/usr/local/mysql/bin/mysql -uroot -pmysql --database=csf </tmp/mysqlbackup/backup_20101215_adb_003.sql

 

從測試服務器導出單個表:

Shell>/usr/local/mysql/bin/mysqldump --user=root -pmysql --port=3306--default-character-set=utf8  --single-transaction=TRUE "csf" "tmp_excel_data_000728" > /tmp/mysqlbackup/backup_20101215_single_table_013.sql

 

在生產庫上導入此表記錄

Shell>/usr/local/mysql/bin/mysql -uroot -pmysql csf < /tmp/mysqlbackup/backup_20101215_single_table_013.sql

檢查數據

Select* from csf. tmp_excel_data_000728;

 

(9)     電源故障恢復

重啟服務器之后,重啟數據庫,mysql自動恢復,斷電時候正在運行的數據庫任務和操作需要重新執行一遍。

(10)  操作系統崩潰恢復

  操作系統恢復之后,重啟數據庫,mysql自動恢復,系統崩潰時正在運行的數據庫任務以及操作需要重新執行一遍

(11)  文件系統崩潰恢復

文件系統恢復之后,重啟數據庫即可,系統崩潰時正在運行的數據庫任務以及操作需要重新執行一遍。

(12)  硬件壞塊恢復

重格磁盤,然后恢復數據庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM