1、概述:mysql
數據備份的介紹,類型,及具;sql
msyqldump備份的實現和數據恢復;(4GB)shell
Xtrabackup備份的實現和數據恢復;(百G)數據庫
備份和恢復(數據):bash
2、介紹服務器
★備份:存儲的數據副本;session
原始數據:持續改變;(考慮問題)app
★恢復:把副本應到線上系統;socket
僅能恢復備份操做時刻的數據狀態;ide
★時間點恢復:
bin-logs;(進制志)
★爲何備份?
災難恢復:硬件故障(冗餘)、軟件故障(bug)、然災害、客***、誤操做、...
測試;
★備份時應該注意事項:
能容忍最多丟失多少數據;
恢復數據須要在多時間內完成;
須要恢復哪些數據;
☉作恢復演練:
測試備份的可性;
加強恢復操做效率;
3、備份類型
★備份的數據的集範圍:
☉徹底備份和部分備份
徹底備份:整個數據集;
部分備份:數據集的部分,如部分表;
★徹底備份、增量備份、差別備份:
徹底備份
增量備份:僅備份上次徹底備份或增量備份以來變量的那部分數據;
差別備份:僅備份上次徹底備份以來變量的那部數據;
★物理備份、邏輯備份:
物理備份:複製數據件進備份;
邏輯備份:從數據庫導出數據另存在個或多個件中;
★根據數據服務是否在線:
熱備:讀寫操做都可進的狀態下所作的備份;
溫備:可讀但不可寫狀態下進的備份;
冷備:讀寫操做均不可進的狀態下所作的備份;
鎖分爲讀鎖和寫鎖:
(1)讀鎖,,不能寫,能夠重複讀
(2)寫鎖,不能讀寫。
(3)備份須要考慮的因素、備份策略及備分內容
★備份策略:
徹底+差別+時間點還原(進制志binlog)
徹底+增量+時間點還原 (進制志binlog)
注意:
事務志和進制志應該放在有冗餘能的磁盤上,RAID10最好
備份具:
4、備份具---mysqldump:
mysql服務帶的備份具;邏輯備份具;
徹底、部分備份;
InnoDB:熱備;
MyISAM:溫備;
★mysqldumper:比mysqldump快上好幾十倍
★做:
邏輯備份、徹底備份、部分備份;
##假如咱們的備份策略爲徹底+增量+binlog備份,要使binlog進制志重讀,就要肯定從備份那刻開始,binlog的起始件位置,這時就要使--master-data=[#]選
項,(確保進制志是開啓的)
(1)開啓log-bin日誌作備份恢復:
##在mysql配置文件裏面加上一下兩句開啓log-bin日誌功能
[root@cml5~]# cat /etc/my.cnf [mysqld] log_bin=/usr/local/mysql/mydata/mysql-bin
server-id=1 ##5.7版本以後要加上server-id最好是惟一值
進入數據庫查看:
mysql>show variables like 'log_bin%';
查看mydata目錄已經有一個mysql-bin.000004二進制日誌文件:
[root@cml5mydata]# ls
a.sh bin_log cml5.err ibdata1 ibtmp1 mysqlbak.log performance_schema sys
auto.cnf chen cml5.pid ib_logfile0 my.cnf mysql-bin.000004 qqq yy
backup cml ib_buffer_pool ib_logfile1 mysql mysql-bin.index rrr
(2)進入數據庫建立一個數據庫cml:
模擬刪除數據庫:
##恢復到建立了cml這個數據庫以前的結點:
##查看mysql-bin.000004二進制日誌文件:
[root@cml5mydata]# mysqlbinlog mysql-bin.000004 # at154 #17111120:16:01 server id 1 end_log_pos 219CRC32 0xa11ff2b3 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no SET@@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219 #17111120:16:01 server id 1 end_log_pos 310CRC32 0x0285112a Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1510402561/*!*/; SET@@session.pseudo_thread_id=4/*!*/; SET@@session.foreign_key_checks=1, @@session.sql_auto_is_null=0,@@session.unique_checks=1, @@session.autocommit=1/*!*/; SET@@session.sql_mode=1436549152/*!*/; SET@@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\Cutf8 *//*!*/; SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET@@session.lc_time_names=0/*!*/; SET@@session.collation_database=DEFAULT/*!*/; create database cml /*!*/; # at 310 #17111120:22:02 server id 1 end_log_pos 375CRC32 0x2ec9b66d Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no SET@@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 375 #17111120:22:02 server id 1 end_log_pos 458CRC32 0x51fb74e9 Query thread_id=5 exec_time=0 error_code=0 SETTIMESTAMP=1510402922/*!*/; drop database cml /*!*/; SET@@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; DELIMITER; # Endof log file /*!50003SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
##恢復到從219到310的節點:
[root@cml5 mydata]# mysqlbinlog --start-position="219"--stop-position="310" mysql-bin.000004 | mysql -uroot -predhat mysql:[Warning] Using a password on the command line interface can be insecure.
##進入數據庫查看cml數據庫上是否已經恢復:
##起始點還原:
##刪除cml數據庫使用起始點還原:
[root@cml5 mydata]# mysqlbinlog --start-datetime="2017-11-11 20:40:37"--stop-datetime="2017-11-11 20:40:55" mysql-bin.000004 | mysql -uroot-predhat mysql:[Warning] Using a password on the command line interface can be insecure.
##查看數據庫是否已經還原數據庫cml:
##關閉當前的二進制日誌文件並建立一個新文件,新的二進制日誌文件的名字在當前的二進制文件的編號上加1。
mysql>flush logs; QueryOK, 0 rows affected (0.00 sec)
5、Mysqldump備份:
(1)備份單個庫:
[root@cml5~]# mysqldump -uroot -predhat --single-transaction -R --triggers -E --master-data--flush-logs --databases data_test >`date +%F"-%H:%M"`.sql
單備份某個庫:
[root@cml5~]# mysqldump -uroot -predhat --single-transaction -R --triggers -E --master-data--flush-logs -databases data_test >`date +%F"-%H:%M"`.sql
(2)備份全部的庫:
[root@cml5~]# mysqldump -uroot -predhat --single-transaction-R --triggers -E --masterdata --flush-logs --all-databases >`date+%F"-%H:%M"`.sql
(3)恢復全部的數據:
[[root@cml5~]# mysql -uroot -predhat < 2017-11-07-17\:01.sql
(4)恢復單個庫:
[[root@cml5~]# mysql -uroot -predhat data_test< 2017-11-07-17\:01.sql
(5)備份數據作全備份,而後倒入從:
[root@cml5 mydata]# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > cml.sql
[root@cml5 mydata]# mysql -uroot -predhat < cml.sql mysql:[Warning] Using a password on the command line interface can be insecure.
(6)那麼基於線上沒可能收到備份因此寫一個shell腳原本自動備份:
[root@cml5~]# cat mysqlback.sh #!/bin/bash ##date=2017-11-7 ##name=cml ##email=********@qq.com ##title=mysqldumpbackup EMAIL="*******@qq.com" mysqlbak_dir=/usr/local/mysql/mydata mysqlbak_log=/usr/local/mysql/mydata/mysqlbak.log DATE=`date+%Y%m%d` TIME=`date+"%y-%m %H:%M:%S"` DUMPBAK=$DATE.sql GZDUMPBAK=$DATE.sql.gz WEEK=`date+%w` cd$mysqlbak_dir USER=root PASSWD=redhat bin_log=`ls-tr mysql-bin.0*| head -1` bin_log_dir=/usr/local/mysql/mydata/bin_log if [ !-f $bin_log_dir ];then mkdir $bin_log_dir fi echo"--------------------------$TIME-----------------------------">> $mysqlbak_log if [$WEEK == 0 ];then ##日期是星期天的時候執行 ##week=0~6 cd $mysqlbak_dir /usr/local/mysql/bin/mysqldump -u$USER-p$PASSWD --single-transaction -R --triggers -E --master-data --flush-logs--all-databases > $DUMPBAK 2>&1 echo "mysqldump backupsuccess!!" >> $mysqlbak_log tar -czvf $GZDUMPBAK $DUMPBAK >>$mysqlbak_log 2>&1 echo "$GZDUMPBAK backupsuccess!!" >> $mysqlbak_log # if [ -f $GZDUMPBAK ];then # echo "$GZDUMPBAK BACKUPSUCCESS!!" |mail -s "mysqldump backup" $EMAIL # fi rm -rf $DUMPBAK rm -rf $bin_log ##上面步驟是全備過程 else cd $mysqlbak_dir /usr/local/mysql/bin/mysqladmin -u$USER-p$PASSWD flush-logs cp -p $bin_log $bin_log_dir echo "copy $bin_log to$bin_log_dir" >> $mysqlbak_log rm -rf $bin_log echo "backup bin_logsuccess!!" >> $mysqlbak_log # echo "backup bin_log $bin_logSUCCESS!" | mail -s "backup bin_log" $EMAIL ##下面是增備過程 fi
[root@cml5~]# cd /usr/local/src/script/ [root@cml5script]# ls mysqlback.sh [root@cml5script]# chmod a+x mysqlback.sh crontab-e 1 0 * ** /usr/local/src/script/mysqlback.sh
6、備份具---Xtrabackup:
(1)介紹及安裝
★簡介:
·Xtrabackup是由percona提供的mysql數據庫備份具,據官介
紹,這也是世界上唯款開源的可以對innodb和xtradb數據庫進
熱備的具。
★特色:
·物理備份,備份過程快速、可靠;
·備份過程不會打斷正在執的事務;
·可以基於壓縮等功能節約磁盤空間和流量;
·動實現備份檢驗;
·還原速度快;
★持的存儲引擎功能
·MyISAM:溫備,不持增量備份;
·InnoDB:熱備,增量;
★安裝:
·其最新版的軟件可從http://www.percona.com/software/
percona-xtrabackup/得到。
·本基於CentOS 7.2的系統,所以,直接下載相應版本的rpm包安裝便可。
(2)在因此數據庫主機上安裝xtrabackup工具
[root@cml2src]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.8/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm [root@cml2src]# yum localinstall percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm
(3)使用xtrabackup工具作全備:
##先查看數據庫的databases:
##建立一個/data備份目錄:
[root@cml5 ~]# mkdir /data/
##把數據庫全備到/data目錄下:
[root@cml5 ~]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1 /data/
##看到completed ok表示已經全備完
##查看備份生成的文件:
[root@cml5 2017-11-11_21-42-13]# pwd /data/2017-11-11_21-42-13 [root@cml5 2017-11-11_21-42-13]# cat xtrabackup_binlog_info mysql-bin.000008 524 [root@cml5 2017-11-11_21-42-13]# ls backup-my.cnf cml ibdata1 performance_schema rrr xtrabackup_binlog_info xtrabackup_info yy chen ib_buffer_pool mysql qqq sys xtrabackup_checkpoints xtrabackup_logfile
(4)在另外一臺主機cml6上作一次全備的還原(模擬數據庫的主機down掉加入新一臺主機)
##先在cml5主機把主備文件copy到對端目錄下:
[root@cml5 2017-11-11_21-42-13]# scp -r * cml6:/data/
##在對端cml6主機上建立data目錄給權限:
[root@cml6 ~]# mkdir /data [root@cml6 ~]# chown -R mysql:mysql /data/
##準備一個數據,保證數據沒有提交的事務,提交或者回滾:
[root@cml6 data]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat--host=127.0.0.1 --apply-log /data/
##出現comleted ok表示已經成功
##直接恢復,先暫停mysql服務器:
[root@cml6 data]# /etc/init.d/mysqld stop Shuttingdown MySQL. SUCCESS! [root@cml6data]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat--host=127.0.0.1 --copy-back /data/ 17111005:39:37 innobackupex: Starting the copy-back operation IMPORTANT:Please check that the copy-back run completes successfully. At the end of a successful copy-backrun innobackupex prints "completed OK!". innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7) Originaldata directory /usr/local/mysql/mydata is not empty!
##修改my.cnf的matadir和給權限:
[root@cml6 data]# cat /etc/my.cnf [mysqld] datadir=/data socket=/usr/local/mysql/mysql.sock log_bin=/usr/local/mysql/mydata/mysql-bin server-id=2 #skip-grant-tables [root@cml6 data]# chown -R mysql:mysql /data/
##直接啓動mysql便可:
[root@cml6 data]# /etc/init.d/mysqld start StartingMySQL.Logging to '/data/cml6.err'. SUCCESS!
##查看數據庫是否與cml5一致:
執行的時候加上壓縮參數。
[root@cml5 data]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=redhat --stream=tar /data/backup | gzip > /data/backup1/`date +%F_%H-%M-%S`.tar.gz
(5)使用xtrabackup工具作增量備份:
##先在mysql數據庫上增長一個數據庫cml2:
##而後建立目錄備份的件錄:
[root@cml5 ~]# mkdir /data/zhengliang1 [root@cml5 ~]# mkdir /data/zhengliang2
##使用xtrabackup作增量備份:
[root@cml5 ~]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1--incremental /data/zhengliang1/--incremental-basedir=/data/2017-11-11_21-42-13/
##出現completed ok!表示已經成功:
##查看備份的數據:
[root@cml5 ~]# cd /data/zhengliang1/2017-11-12_00-06-04/ [root@cml5 2017-11-12_00-06-04]# ls backup-my.cnf cml2 ibdata1.meta qqq xtrabackup_binlog_info xtrabackup_logfile chen ib_buffer_pool mysql rrr xtrabackup_checkpoints yy cml ibdata1.delta performance_schema sys xtrabackup_info [root@cml5 2017-11-12_00-06-04]# cat xtrabackup_binlog_info mysql-bin.000008 683
##scpzhengliang1的目錄到對端cml6的任意一個目錄下:
[root@cml5 2017-11-12_00-06-04]# scp -r /data/zhengliang1/ cml6:/usr/local/src/
「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。(重放這步驟必定不能忘記)
基於全部的備份將未提交的事務進行「回滾」。
##這兒步驟意識是把本地的數據庫「重放」
[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --apply-log --redo-only/data/
##這步驟是合併全備和增備的日誌:
[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/--incremental-dir=/usr/local/src/zhengliang1/2017-11-12_00-06-04/
##而後在全目錄下恢復「回滾」:
[root@cml6 src]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --copy-back/data/ 17111006:10:44 innobackupex: Starting the copy-back operation IMPORTANT:Please check that the copy-back run completes successfully. At the end of a successful copy-backrun innobackupex prints "completed OK!". innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id:97330f7) Originaldata directory /data is not empty!
##查看本地數據庫是否與cml5的對應:(注意整個備份恢復都不用關閉mysql或重啓mysql)
##已經多了cml2的數據庫了
##在cml5在作一次增量備份的時候,假如加入一臺新的主機的話備份就先要作(全備恢復à第一次增量備份恢復à第二次增量備份恢復à……)
##在操做一次以上步驟:
##加入新的數據
##備份到zhengliang2目錄:
[root@cml5 data]# innobackupex --default-file=/etc/my.cnf -uroot -predhat --host=127.0.0.1--incremental /data/zhengliang2/--incremental-basedir=/data/zhengliang1/2017-11-12_00-06-04/
##查看備份數據:
[root@cml5 data]# cd zhengliang2/2017-11-12_00-28-50/ [root@cml5 2017-11-12_00-28-50]# ls backup-my.cnf cml3 mysql sys xtrabackup_logfile chen ib_buffer_pool performance_schema xtrabackup_binlog_info yy cml ibdata1.delta qqq xtrabackup_checkpoints cml2 ibdata1.meta rrr xtrabackup_info [root@cml5 2017-11-12_00-28-50]# cat xtrabackup_binlog_info mysql-bin.000008 842
##scp到對端主機:
[root@cml5 2017-11-12_00-28-50]# scp -r /data/zhengliang2/ cml6:/usr/local/src/
##在對端主機上恢復備份:
##回放
[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/
##合併日誌:
[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --apply-log--redo-only /data/ --incremental-dir=/usr/local/src/zhengliang2/2017-11-12_00-28-50/
##回滾:
[root@cml6 src]# innobackupex --defaults-file=/etc/my.cnf -uroot -predhat --copy-back/data/ 17111006:29:50 innobackupex: Starting the copy-back operation IMPORTANT:Please check that the copy-back run completes successfully. At the end of a successful copy-back runinnobackupex prints "completed OK!". innobackupexversion 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id:97330f7) Originaldata directory /data is not empty!
##查看數據庫: