mysql 增量備份還原

2021-07-07 07:18:49 字數 3355 閱讀 6837

小量的資料庫可以每天進行完整備份,因為這也用不了多少時間,但當資料庫很大時,就不太可能每天進行一次完整備份了,這時候就可以使用增量備份。增量備份的原理就是使用了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 > set global 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 > set global 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 = utf8mysqlbinlog會從my.cnf中的[client]讀取配置,但奈何mysqlbinlog並不認識這個選項(據說是個bug)導致的。

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

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

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

Mysql大資料備份和增量備份及還原

目前主流的有兩個工具可以實現物理熱備 ibbackup和xtrabackup ibbackup是需要授權 昂貴,而xtrabackup功能比ibbackup強大而且是開源的xtrabackup提供了兩種命令列工具 xtrabackup 專用於備份innodb和xtradb引擎的資料 innoback...

Mysql大資料備份和增量備份及還原

目前主流的有兩個工具可以實現物理熱備 ibbackup和xtrabackup ibbackup是需要授權 昂貴,而xtrabackup功能比ibbackup強大而且是開源的xtrabackup提供了兩種命令列工具 xtrabackup 專用於備份innodb和xtradb引擎的資料 innoback...

mysql增量備份檔案 mysql增量備份

突然說要我研究下增量備份,表示在此之前真的不知道這是什麼意思,網上搜說 是指在一次全備份或上一次增量備份後,以後每次的備份只需備份與前一次相比增加或者被修改的檔案。我通俗理解就是 在前一次的備份基礎上去增刪改。然後就花費了我一下午的時間,中間的心酸就不提了,正式來吧 1 首先進去cmd以管理員身份進...