天天看點

MySQL增量備份與恢複執行個體

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

本次操作的mysql版本為<code>5.5.40 for linux (x86_64)</code>。

首先對pak資料庫做一個完整備份:

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

模拟插入資料和誤操作

a. 在pak庫的某個表插入一些資料,然後執行<code>flush logs</code>指令。這時将會産生一個新的二進制日志檔案mysql-bin.000003,mysql-bin.000002則儲存了全備過後的所有更改,既增加記錄的操作也儲存在了mysql-bin.00002中。

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

開始恢複

恢複過程不要記錄日志:

首先導入全備資料

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

檢視目前所在二進制日志中的位置:

根據上面兩個position能大概确定需要完整恢複哪幾個binlog檔案。

恢複mysql-bin.000002

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

此時查詢可以得到前兩條資料。

恢複部分mysql-bin.000003

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

如果知道誤操作的指令如<code>drop table</code>,則可以通過下面的方法在binlog檔案中找到誤操作之前的那個position:

(如下面的資訊顯示,誤操作<code>drop table</code>之前的pos是775,在datetime 141204 15:08:04或pos 882時完成<code>drop table</code>操作)

恢複指令:

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

如果不是誤操作導緻的,而是遷移資料庫,那麼不需要position或datetime,使用所有binlog檔案增量恢複即可。

确定恢複成功後記得打開日志記錄:

報錯

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

在使用<code>mysqlbinlog</code>檢視二進制日志的時候,提示下面的錯誤:

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

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

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

第一,自然是注釋到<code>[client]</code>中的這個字元集配置;

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