程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL增量備份與恢復實例

MySQL增量備份與恢復實例

編輯:MySQL綜合教程

MySQL增量備份與恢復實例


小量的數據庫可以每天進行完整備份,因為這也用不了多少時間,但當數據庫很大時,就不太可能每天進行一次完整備份了,這時候就可以使用增量備份。增量備份的原理就是使用了mysql的binlog日志。

本次操作的MySQL版本為 5.5.40 for Linux (x86_64) 。

增量備份要確保打開了二進制日志,參考 mysql的日志系統 :

mysql> show variables like'%log_bin%';

首先對pak數據庫做一個完整備份:

$ mysqldump -h localhost -upak -ppwd -P3306 --master-data=2 --single-transaction --opt pak > pak_bak_full.sql 

這時候就會得到一個全備文件pak_bak_full.sql。mysqldump操作會導致滾動一次log,假設新的binlog文件是mysql-bin.000002。

模擬插入數據和誤操作

a. 在pak庫的某個表插入一些數據,然後執行 flush logs 命令。這時將會產生一個新的二進制日志文件mysql-bin.000003,mysql-bin.000002則保存了全備過後的所有更改,既增加記錄的操作也保存在了mysql-bin.00002中。

b. 再在pak庫中的t_user表中增加兩條記錄,然後誤刪除t_user表。t_user中增加記錄的操作和刪除表的操作都記錄在mysql-bin.000003中。

開始恢復

恢復過程不要記錄日志:

mysql > setglobal sql_log_bin=0;

首先導入全備數據

 $ mysql -h localhost -upak -ppwd < pak_bak_full.sql
或
mysql> source /path/backup/pak_bak_full.sql

我們也可以看到全備時的binlog位置:

head -50 backup-file.sql |grep 'CHANGE MASTER' -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4321;

查看當前所在二進制日志中的位置:

mysql> show master status;

根據上面兩個position能大概確定需要完整恢復哪幾個binlog文件。

恢復mysql-bin.000002

在待恢復的position或時間點以前、全備以後的binlog需要全部恢復,多個文件以空格隔開

$ mysqlbinlog /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p 

此時查詢可以得到前兩條數據。

恢復部分mysql-bin.000003

這個日志中包括了新增記錄和誤刪表兩個部分,我們需要恢復到新增記錄之後、誤刪操作以前的位置。

如果知道誤操作的命令如 DROP TABLE ,則可以通過下面的方法在binlog文件中找到誤操作之前的那個position:

(如下面的信息顯示,誤操作 DROP TABLE 之前的pos是775,在datetime 141204 15:08:04或pos 882時完成 DROP TABLE 操作)

 $ mysqlbinlog /var/lib/mysql/mysql-bin.000003 |grep -C 5 'DROP TABLE'
#141204 15:07:05 server id 1  end_log_pos 775   Xid = 376
COMMIT/*!*/;
# at 775
#141204 15:08:04 server id 1  end_log_pos 882   Query   thread_id=10    exec_time=0 error_code=0
SET TIMESTAMP=1417676884/*!*/;
DROP TABLE `t_user` /* generated by server */
/*!*/;
# at 882

恢復命令:

$ mysqlbinlog /var/lib/mysql/mysql-bin.000003 --stop-position=775 | mysql -h localhost -uroot -p 

如果position難以確定,但知道需要恢復到的確切(服務器)時間,也可以使用datetime:

$ mysqlbinlog /var/lib/mysql/mysql-bin.000003 --stop-datetime="2014-12-04 15:08:00" | mysql -uroot -p 

如果不是誤操作導致的,而是遷移數據庫,那麼不需要position或datetime,使用所有binlog文件增量恢復即可。

確定恢復成功後記得打開日志記錄:

mysql > setglobal sql_log_bin=1;

報錯

1. unknown variable 'default-character-set=utf8'

在使用 mysqlbinlog 查看二進制日志的時候,提示下面的錯誤:

/usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8'

原因是在我為了統一mysql客戶端到服務端的的字符編碼,在 /etc/my.cnf 文件的 [client] 、 [mysqld] 等節加入了 default-character-set = utf8 ,mysqlbinlog 會從 my.cnf 中的 [client] 讀取配置,但奈何mysqlbinlog並不認識這個選項(據說是個bug)導致的。

應對這個bug的方法有兩個:

第一,自然是注釋到 [client] 中的這個字符集配置;

第二,改用 loose-default-character-set = utf8 。在選項前加了 loose-,表示當程序不認識此選項時會略過此選項,並給出一個警告。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved