簡介:mysql
在這以前都是經過 mysqldump 來備份數據庫的,因爲是邏輯備份,因此採用這種備份方式數據是很安全的,跨平臺、版本都很容易。
凡事有利必有弊,邏輯備份在你數據庫比較大時,備份、恢復數據所耗費的時間也是蠻長的,因此要不斷改進,使用物理備份。
因爲線上數據庫表使用的是混合引擎 MyISAM 跟 Innodb ,因此也不能使用 mysqlhotcopy ,這個工具仍是蠻好用的,惋惜只能備份 MyISAM。
Percona XtraBackup 是 Percona 公司開發的一個用於 MySQL 數據庫物理熱備的備份工具,且是開源項目。
瞭解到 XtraBackup 工具下有一個 innobackupex 支持 MyISAM 跟 Innodb 的備份,因此來搞一搞。
1、安裝 XtraBackupsql
shell > yum -y install https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
# 或者shell
shell > wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm shell > yum -y install epel-release shell > yum -y install rsync libev-devel numactl-devel perl-DBD-MySQL shell > rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
# 須要解決依賴關係數據庫
2、innobackupex 全備vim
shell > innobackupex --user=user --password=passwd --no-timestamp ./2016/09-29/`date +%H-%M`.dbname
# --no-timestamp 若是不加的話會在備份目錄下生成一個備份時間的目錄,備份數據存在該目錄下安全
# 將整個數據庫備份到 ./2016/09-29/ 以備份時間加自定義名稱的一個目錄下bash
# 雖然能夠使用 --stream=tar 加 | gzip > 的方式直接打包並壓縮,可是備份速度就降低了,因此我寧願快速備份,以後再去處理打包、壓縮。app
# 全備腳本工具
shell > vim script/backupdb.sh #!/bin/bash # 0 0 */2 * * sh /root/script/backupdb.sh # author: Wang XiaoQiang 2016/09/29 dbname='alldatabases' dbuser='user' dbpassword='passwd' backup_dir='/data/backup_db' backup_log='/root/script/logs/backup.log' ymtime=`date +%Y-%m` dtime=`date +%d` wlog(){ echo -e "`date "+%F %T"` DBname: $1 State: $2\n" >> $backup_log } [ ! -d $backup_dir/$ymtime ] && mkdir -p $backup_dir/$ymtime cd $backup_dir/$ymtime && /usr/bin/innobackupex --user=$dbuser --password=$dbpassword --no-timestamp $dbname > /dev/null 2>&1 if [ $? -eq 0 ];then wlog $dbname 'Backup success.' dbakfile=$dbname.$dtime.tar.gz tar zcf $dbakfile $dbname --remove-files [ $? -eq 0 ] && wlog $dbakfile 'Packaging success.' || wlog $dbakfile 'Packaging failed.' else wlog $dbname 'Backup failed.' fi # End
3、innobackupex 全備恢復測試
shell > /etc/init.d/mysql.server stop # 首先關閉數據庫 shell > cd /data/backup_db # 切換到備份目錄 shell > mv /usr/local/mysql-5.5.52/data data.old # 將原來的數據目錄備份一下 shell > tar zxf alldatabase.11.tar.gz # 而後將原來的備份解壓縮 shell > innobackupex --apply-log alldatabase # 在備份上應用日誌,通常沒有看到報錯且最後顯示 OK 就沒有問題 ( --use-memory 使用該參數加快速度 ) 161011 12:07:33 completed OK! shell > innobackupex --copy-back alldatabase # 將備份還原到 my.cnf 指定的 datadir 中,不指定 --defaults-file,默認 /etc/my.cnf Error: datadir must be specified. # 報錯信息顯示,在默認配置文件 /etc/my.cnf 中,沒有找到 datadir 配置項 shell > vim /etc/my.cnf # 加入 datadir 配置項 datadir = /usr/local/mysql-5.5.52/data shell > innobackupex --copy-back alldatabase # 再次執行 copy 動做,沒有報錯且顯示 OK 161011 12:17:52 completed OK! shell > ll -d /usr/local/mysql-5.5.52/data drwxr-x--- 6 root root 4096 10月 11 12:17 /usr/local/mysql-5.5.52/data shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data # 修改數據目錄權限 shell > /etc/init.d/mysql.server start
# 備份已經恢復!
# 回顧整個恢復過程,發現一個問題:以前數據庫裏的東西所有沒有了...
# 也就是說,innobackupex 只適用於該 MySQL 中除系統庫外,只有一個庫的備份。
# 雖然有選項 --databases 能夠指定備份哪一個數據庫,可是備出來的結果倒是 all databases,且恢復的時候也是所有覆蓋。
# 一、採用 innobackupex 備份整庫,而後恢復到一臺新庫上,再經過 mysqldump 將須要還原的單庫備份一次,以後導入須要恢復的數據庫中 ( 要考慮恢復時間 )。
# 二、採用 innobackupex 備份只有一個業務庫的 MySQL Server,恢復到只有該業務庫的 MySQL Server 中。
# 三、若是一個 MySQL Server 中有多個數據庫,又只想備份某個庫,且該庫體積比較小的狀況下,建議使用 mysqldump 備份。
3、innobackupex 增備
shell > mysql -uuser -ppassword -A # 建立測試庫、表,插入測試數據 mysql> create database test_incre character set utf8; mysql> create table test_incre.incre(id int(10) not null,name varchar(20)); mysql> insert into test_incre.incre values(1,'Wang XiaoQiang'); mysql> quit shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp /data/backup_db/test_incre # 第一次全備
# 再次證實:--databases 就是來賣萌的,你能夠去源數據庫目錄 du -sh 跟 目標備份目錄 du -sh 比對,真的是一毛同樣。
shell > mysql -uuser -ppassword -A # 添加測試數據 mysql> insert into test_incre.incre values(2,'Xiao GuaiShou'); mysql> quit shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre --incremental /data/backup_db/test_incre01
# --incremental-basedir=/data/backup_db/test_incre 第一次增備指定全備路徑
# --incremental 參數說明這是一次增備,並指定增備路徑
# 全備目錄 du -sh 跟 增備目錄 du -sh 比較發現,增備目錄只比全備目錄少了 1G,這說明對於 MyISAM 表來說,仍是全備!!!
shell > mysql -uuser -ppassword -A # 再次添加測試數據 mysql> insert into test_incre.incre values(3,'King'); mysql> quit shell > innobackupex --user=user --password=password --database=test_incres --no-timestamp --incremental-basedir=/data/backup_db/test_incre01 --incremental /data/backup_db/test_incre02
# 第二次增備是在第一次增備的基礎上,因此 --incremental-basedir 指定的是第一次增備目錄,最後指定的第二次增備目錄
shell > cat test_incre/xtrabackup_checkpoints # backup_type 提示:這是一次全備,from_lsn 從 0 開始至 1601917 結束 backup_type = full-backuped from_lsn = 0 to_lsn = 1601917 last_lsn = 1601917 compact = 0 recover_binlog_info = 0 shell > cat test_incre01/xtrabackup_checkpoints # backup_type 提示:這是一次增備,from_lsn 從上次結束 lsn 1601917 開始至 1602789 結束 backup_type = incremental from_lsn = 1601917 to_lsn = 1602789 last_lsn = 1602789 compact = 0 recover_binlog_info = 0 shell > cat test_incre02/xtrabackup_checkpoints # backup_type 提示;這是一次增備,from_lsn 從上次結束 lsn 1602789 開始至 1603652 結束 backup_type = incremental from_lsn = 1602789 to_lsn = 1603652 last_lsn = 1603652 compact = 0 recover_binlog_info = 0
# 好了,這就是增量備份了,能夠發現:對於 MyISAM 來講所有是全量備份,而且根本沒有什麼 --databases 一說。
# 增備腳本
4、innobackupex 增備恢復
shell > /etc/init.d/mysql.server stop # 關閉數據庫 shell > cd /data/backup_db shell > mv /usr/local/mysql-5.5.52/data data.old02 # 備份原有數據庫 shell > innobackupex --apply-log --redo-only test_incre # 指定全備目錄,--redo-only 對已提交的事務進行前滾,僅最後一次增備恢復不須要添加該參數 shell > innobackupex --apply-log --redo-only test_incre --incremental-dir=/data/backup_db/test_incre01 # --incremental-dir 指定第一次增備目錄 ( 絕對路徑 ) shell > innobackupex --apply-log test_incre --incremental-dir=/data/backup_db/test_incre02 # 指定第二次增備目錄,最後一次增備還原不須要添加 --redo-only 參數 shell > innobackupex --copy-back test_incre # 最後一步,複製整合後的全備文件,位置爲 my.cnf 中 datadir 指定路徑 shell > chown -R mysql.mysql /usr/local/mysql-5.5.52/data shell > /etc/init.d/mysql.server start # 啓動數據庫,查看數據是否恢復 shell > mysql -uuser -ppassword -A mysql> select * from test_incre.incre; +----+----------------+ | id | name | +----+----------------+ | 1 | Wang XiaoQiang | | 2 | Xiao GuaiShou | | 3 | King | +----+----------------+
# OK,木有問題!