一、MySQL備份恢復(fù)
常用工具:
- mysqldump:邏輯備份工具,適用所有存儲(chǔ)引擎,溫備;支持完全或部分備份;對InnoDB存儲(chǔ)引擎支持熱備,結(jié)合binlog的增量備份
- xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份
1.1 mysqldump工具
語法:
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] –B DB1 [DB2 DB3...]
mysqldump [OPTIONS] –A [OPTIONS]
選項(xiàng):
-A, --all-databases 備份所有數(shù)據(jù)庫,含create database
-B , --databases db_name… 指定備份的數(shù)據(jù)庫,包括create database語句
-E, --events 備份相關(guān)的所有event scheduler
-R, --routines 備份所有存儲(chǔ)過程和自定義函數(shù)
--triggers:備份表相關(guān)觸發(fā)器,默認(rèn)啟用,用--skip-triggers,不備份觸發(fā)器
--default-character-set=utf8 指定字符集
--master-data[=#]: 此選項(xiàng)須啟用二進(jìn)制日志
1:所備份的數(shù)據(jù)之前加一條記錄為CHANGE MASTER TO語句,非注釋,不指定#,默認(rèn)為1
2:記錄為注釋的CHANGE MASTER TO語句
此選項(xiàng)會(huì)自動(dòng)關(guān)閉--lock-tables功能,自動(dòng)打開-x | --lock-all-tables功能(除非開啟--single-transaction)
-F, --flush-logs 備份前滾動(dòng)日志,鎖定表完成后,執(zhí)行flush logs命令,生成新的二進(jìn)制日志文件,配合-A 或 -B 選項(xiàng)時(shí),會(huì)導(dǎo)致刷新多次數(shù)據(jù)庫。建議在同一時(shí)刻執(zhí)行轉(zhuǎn)儲(chǔ)和日志刷新,可通過和--single-transaction或-x,--master-data 一起使用實(shí)現(xiàn),此時(shí)只刷新一次日志
按存儲(chǔ)引擎分類:
- MyISAM備份選項(xiàng):
支持溫備;不支持熱備,所以必須先鎖定要備份的庫,而后啟動(dòng)備份操作
鎖定方法如下:
-x,--lock-all-tables:加全局讀鎖,鎖定所有庫的所有表,同時(shí)加--single-transaction或--lock-tables選項(xiàng)會(huì)關(guān)閉此選項(xiàng)功能
注意:數(shù)據(jù)量大時(shí),可能會(huì)導(dǎo)致長時(shí)間無法并發(fā)訪問數(shù)據(jù)庫
-l,--lock-tables:對于需要備份的每個(gè)數(shù)據(jù)庫,在啟動(dòng)備份之前分別鎖定其所有表,默認(rèn)為on,--skip-lock-tables選項(xiàng)可禁用,對備份MyISAM的多個(gè)庫,可能會(huì)造成數(shù)據(jù)不一致
注:以上選項(xiàng)對InnoDB表一樣生效,實(shí)現(xiàn)溫備,但不推薦使用
- InnoDB備份選項(xiàng): 支持熱備,可用溫備但不建議用
--single-transaction
此選項(xiàng)Innodb中推薦使用,不適用MyISAM,此選項(xiàng)會(huì)開始備份前,先執(zhí)行START TRANSACTION指令開啟事務(wù)
此選項(xiàng)通過在單個(gè)事務(wù)中轉(zhuǎn)儲(chǔ)所有表來創(chuàng)建一致的快照。 僅適用于存儲(chǔ)在支持多版本控制的存儲(chǔ)引擎中的表(目前只有InnoDB可以); 轉(zhuǎn)儲(chǔ)不保證與其他存儲(chǔ)引擎保持一致。 在進(jìn)行單事務(wù)轉(zhuǎn)儲(chǔ)時(shí),要確保有效的轉(zhuǎn)儲(chǔ)文件(正確的表內(nèi)容和二進(jìn)制日志位置),沒有其他連接應(yīng)該使用以下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
此選項(xiàng)和--lock-tables(此選項(xiàng)隱含提交掛起的事務(wù))選項(xiàng)是相互排斥
備份大型表時(shí),建議將--single-transaction選項(xiàng)和--quick結(jié)合一起使用
示例1:完全備份Innodb存儲(chǔ)引擎數(shù)據(jù)庫
BACKUP_TIME=`date +%F-%H%M`
mysqldump –uroot -p -A --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
示例2:完全備份MyISAM存儲(chǔ)引擎數(shù)據(jù)庫
BACKUP_TIME=`date +%F-%H%M`
mysqldump –uroot -A -x --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
1.2 xtrabackup
備份語法:
xtrabackup [option] BACKUP-ROOT-DIR
選項(xiàng):
--user 該選項(xiàng)表示備份賬號
--password 該選項(xiàng)表示備份的密碼
--host 該選項(xiàng)表示備份數(shù)據(jù)庫的地址
--databases 該選項(xiàng)接受的參數(shù)為數(shù)據(jù)庫名,如果要指定多個(gè)數(shù)據(jù)庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時(shí),在指定某數(shù)據(jù)庫時(shí),也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項(xiàng)對innodb引擎表無效,還是會(huì)備份所有innodb表
--defaults-file 該選項(xiàng)指定從哪個(gè)文件讀取MySQL配置,必須放在命令行第一個(gè)選項(xiàng)位置
--incremental 該選項(xiàng)表示創(chuàng)建一個(gè)增量備份,需要指定--incremental-basedir
--incremental-basedir 該選項(xiàng)指定為前一次全備份或增量備份的目錄,與--incremental同時(shí)使用
--incremental-dir 該選項(xiàng)表示還原時(shí)增量備份的目錄
--include=name 指定表名,格式:databasename.tablename
--apply-log 一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復(fù)操作,因?yàn)閭浞莸臄?shù)據(jù)中可能會(huì)包含尚未提交的事務(wù)或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。因此,此時(shí)數(shù)據(jù)文件仍處理不一致狀態(tài)。此選項(xiàng)作用是通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件使數(shù)據(jù)文件處于一致性狀態(tài)
--use-memory 和--apply-log選項(xiàng)一起使用,當(dāng)prepare 備份時(shí),做crash recovery分配的內(nèi)存大小,單位字節(jié),也可1MB,1M,1G,1GB等,推薦1G
--export 表示開啟可導(dǎo)出單獨(dú)的表之后再導(dǎo)入其他Mysql中
--redo-only 此選項(xiàng)在prepare base full backup,往其中合并增量備份時(shí)候使用,但不包括對最后一個(gè)增量備份的合并
還原語法:
xtrabackup --copy-back [選項(xiàng)] BACKUP-DIR
innobackupex --move-back [選項(xiàng)] [--defaults-group=GROUP-NAME] BACKUP-DIR
選項(xiàng):
--copy-back 做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir
--move-back 這個(gè)選項(xiàng)與--copy-back相似,唯一的區(qū)別是它不拷貝文件,而是移動(dòng)文件到目的地。這個(gè)選項(xiàng)移除backup文件,用時(shí)候必須小心。使用場景:沒有足夠的磁盤空間同事保留數(shù)據(jù)文件和Backup副本
1.2.1 xtrabackup 備份相關(guān)文件
- 使用xtrabackup備份時(shí),其會(huì)調(diào)用xtrabackup備份所有的InnoDB表,復(fù)制所有關(guān)于表結(jié)構(gòu)定義的相關(guān)文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關(guān)文件,同時(shí)還會(huì)備份觸發(fā)器和數(shù)據(jù)庫配置信息相關(guān)的文件。
這些文件會(huì)被保存至一個(gè)以時(shí)間命名的目錄中,在備份時(shí),xtrabackup還會(huì)在備份目錄中創(chuàng)建如下文件:
- xtrabackup_info:xtrabackup工具執(zhí)行時(shí)的相關(guān)信息,包括版本,備份選項(xiàng),備份時(shí)長,備份LSN(log sequence number日志序列號),BINLOG的位置
- xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN范圍信息,每個(gè)InnoDB頁(通常為16k大小)都會(huì)包含一個(gè)日志序列號LSN。LSN是整個(gè)數(shù)據(jù)庫系統(tǒng)的系統(tǒng)版本號,每個(gè)頁面相關(guān)的LSN能夠表明此頁面最近是如何發(fā)生改變的
- xtrabackup_binlog_info:MySQL服務(wù)器當(dāng)前正在使用的二進(jìn)制日志文件及至備份這一刻為止二進(jìn)制日志事件的位置,可利用實(shí)現(xiàn)基于binlog的恢復(fù)
- backup-my.cnf:備份命令用到的配置選項(xiàng)信息
- xtrabackup_logfile:備份生成的日志文件
示例1:xtrabackup完全備份及還原
1. 在原主機(jī)做完全備份到/backup
xtrabackup -uroot -p --backup --target-dir=/backup/
2. 目標(biāo)主機(jī)
scp -r /backup/* root@172.16.77.132:/backups
xtrabackup --prepare --target-dir=/backups/ ##預(yù)準(zhǔn)備:確保數(shù)據(jù)一致,提交完成的事務(wù),回滾未完成的事務(wù)
/etc/init.d/mysqld stop
rm -rf /data/mysql-5.7/*
xtrabackup --copy-back --target-dir=/backups/ ##復(fù)制到數(shù)據(jù)庫目錄,確保原目錄為空
chown -R mysql:mysql /data/mysql-5.7 ##還原屬性
/etc/init.d/mysqld start ##啟動(dòng)服務(wù)
mysql -uroot -p000000 ##簡單測試
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| hellodb |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
8 rows in set (0.01 sec)
mysql> exit
Bye
示例2:xtrabackup完全,增量備份及還原
1. 備份操作
1)完全備份
xtrabackup -uroot -p000000 --backup --target-dir=/backup/base
2)修改數(shù)據(jù)
mysql -uroot -p000000
UPDATE hellodb.students SET classid=+1;
Query OK, 0 rows affected (0.02 sec)
Rows matched: 25 Changed: 25 Warnings: 0
quit
3)增量備份
xtrabackup -uroot -p000000 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
scp -r /backup/* 172.16.77.132:/backups/ ##拷貝備份目錄到目標(biāo)主機(jī)
2. 還原操作
1)預(yù)準(zhǔn)備完成備份,此選項(xiàng)--apply-log-only 阻止回滾未完成的事務(wù)
xtrabackup --prepare --apply-log-only --target-dir=/backups/base
2)合并增量備份到完全備份
xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1
3)復(fù)制到數(shù)據(jù)庫目錄,注意數(shù)據(jù)庫目錄必須為空,MySQL服務(wù)不能啟動(dòng)
xtrabackup --copy-back --target-dir=/backups/base
4)還原屬性
chown -R mysql:mysql /data/mysql-5.7
5)啟動(dòng)服務(wù)
/etc/init.d/mysqld start
mysql -uroot -p000000 ##簡單測試
mysql> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
| 1 | Shi Zhongyu | 22 | M | 1 | 3 |
| 2 | Shi Potian | 22 | M | 1 | 7 |
| 3 | Xie Yanke | 53 | M | 1 | 16 |
| 4 | Ding Dian | 32 | M | 1 | 4 |
| 5 | Yu Yutong | 26 | M | 1 | 1 |
| 6 | Shi Qing | 46 | M | 1 | NULL |
| 7 | Xi Ren | 19 | F | 1 | NULL |
| 8 | Lin Daiyu | 17 | F | 1 | NULL |
| 9 | Ren Yingying | 20 | F | 1 | NULL |
| 10 | Yue Lingshan | 19 | F | 1 | NULL |
| 11 | Yuan Chengzhi | 23 | M | 1 | NULL |
| 12 | Wen Qingqing | 19 | F | 1 | NULL |
| 13 | Tian Boguang | 33 | M | 1 | NULL |
| 14 | Lu Wushuang | 17 | F | 1 | NULL |
| 15 | Duan Yu | 19 | M | 1 | NULL |
| 16 | Xu Zhu | 21 | M | 1 | NULL |
| 17 | Lin Chong | 25 | M | 1 | NULL |
| 18 | Hua Rong | 23 | M | 1 | NULL |
| 19 | Xue Baochai | 18 | F | 1 | NULL |
| 20 | Diao Chan | 19 | F | 1 | NULL |
| 21 | Huang Yueying | 22 | F | 1 | NULL |
| 22 | Xiao Qiao | 20 | F | 1 | NULL |
| 23 | Ma Chao | 23 | M | 1 | NULL |
| 24 | Xu Xian | 27 | M | 1 | NULL |
| 25 | Sun Dasheng | 100 | M | 1 | NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)
1.3 生產(chǎn)環(huán)境實(shí)戰(zhàn)備份策略
???????編寫shell腳本,支持讓用戶自主選擇,使用mysqldump還是xtrabackup全量備份。
cat mysql_backup.sh
#!/bin/bash
while true
do
read -p "Enter mysqldump or xtrabackup: " option
case $option in
mysqldump)
for db in `mysql -uroot -p000000 -e 'show databases'|grep -Ev '^(information_schema|performance_schema|Database)$'`;do mysqldump -uroot -p000000 -B $db --single-transaction --master-data=2 |gzip > /data/$db.sql.gz ;done
;;
xtrabackup)
xtrabackup -uroot -p000000 --backup --target-dir=/backup/`date +%F-%H%M`
;;
*)
echo "invalide selection,please try again"
break
;;
esac
done
二、MySQL集群
2.1 主從復(fù)制
???????每個(gè)節(jié)點(diǎn)都有相同的數(shù)據(jù)集,向外擴(kuò)展;主要通過復(fù)制二進(jìn)制日志實(shí)現(xiàn),單向。
???????復(fù)制功用:
???????- 數(shù)據(jù)分布
???????- 負(fù)載均衡讀
???????- 備份
???????- 高可用和故障切換
???????- MySQL升級測試
2.1.1 主從復(fù)制架構(gòu)
常見部署架構(gòu):
2.1.2 主從復(fù)制工作原理
2.1.3 主從復(fù)制配置
1. 主節(jié)點(diǎn)配置
vi /etc/my.cnf
log-bin # 啟用二進(jìn)制日志
server_id=1 #為當(dāng)前節(jié)點(diǎn)設(shè)置全局唯一的ID號
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY '000000'; ##創(chuàng)建一個(gè)具有復(fù)制權(quán)限的賬號
2. 從節(jié)點(diǎn)配置
vi /etc/my.cnf
server_id=2 #為當(dāng)前節(jié)點(diǎn)設(shè)置全局唯一的ID號
read_only=on #設(shè)置數(shù)據(jù)庫只讀
mysql -uroot -p000000
CHANGE MASTER TO MASTER_HOST='172.16.77.132',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mariadb-bin.xxxxxx',
MASTER_LOG_POS=#;
start slave;
show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.77.132
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000004
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: localhost-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.2 高可用
2.2.1 MHA簡介
???????Master High Availability(MHA),對主節(jié)點(diǎn)進(jìn)行監(jiān)控,可實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移至其它從節(jié)點(diǎn);通過提升某一從節(jié)點(diǎn)為新的主節(jié)點(diǎn),基于主從復(fù)制實(shí)現(xiàn),還需要客戶端配合實(shí)現(xiàn),目前MHA主要支持一主多從的架構(gòu),要搭建MHA,要求一個(gè)復(fù)制集群中必須最少有三臺(tái)數(shù)據(jù)庫服務(wù)器,一主二從,即一臺(tái)充當(dāng)master,一臺(tái)充當(dāng)備用master,另外一臺(tái)充當(dāng)從庫。
2.2.2 MHA集群架構(gòu)
2.2.3 MHA工作原理
- 從宕機(jī)崩潰的master保存二進(jìn)制日志事件(binlog events)
- 識別含有最新更新的slave
- 應(yīng)用差異的中繼日志(relay log)到其他的slave
- 應(yīng)用從master保存的二進(jìn)制日志事件(binlog events)
- 提升一個(gè)slave為新的master
- 使其他的slave連接新的master進(jìn)行復(fù)制
2.3.4 MHA實(shí)現(xiàn)
管理節(jié)點(diǎn):
1. 安裝軟件包
yum -y install mha4mysql*.rpm
2. 創(chuàng)建配置文件
mkdir /etc/mha
vim /etc/mha/app1.cnf
[server default]
user=mhauser
password=000000
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=000000
ping_interval=1
[server1]
hostname=172.16.77.131
candidate_master=1
[server2]
hostname=172.16.77.132
candidate_master=1
[server3]
hostname=172.16.77.133
3. 修改配置文件(主節(jié)點(diǎn))
vim /etc/my.cnf
[mysqld]
log-bin ##啟用二進(jìn)制日志
server_id=2 #為當(dāng)前節(jié)點(diǎn)設(shè)置全局唯一的ID號
skip_name_resolve=1
4. 在所有節(jié)點(diǎn)實(shí)現(xiàn)相互之間ssh key驗(yàn)證
ssh-keygen -t rsa -P ' '
scp -r .ssh 172.16.77.133:/root/
scp -r .ssh 172.16.77.132:/root/
scp -r .ssh 172.16.77.131:/root/
被管理節(jié)點(diǎn):
1. 安裝軟件包
yum -y install mha*.rpm
2. 創(chuàng)建相應(yīng)賬號(主節(jié)點(diǎn))
mysql -uroot -p000000
mysql> show master logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 177 |
| localhost-bin.000002 | 177 |
| localhost-bin.000003 | 177 |
| localhost-bin.000004 | 333 |
| localhost-bin.000005 | 177 |
| localhost-bin.000006 | 177 |
| localhost-bin.000007 | 154 |
+----------------------+-----------+
7 rows in set (0.00 sec)
grant replication slave on *.* to repluser@'172.16.77.%' identified by '000000';;
grant all on *.* to mhauser@'172.16.77.%' identified by '000000';
3. 編輯配置文件(從節(jié)點(diǎn))
[mysqld]
server_id=1 #為當(dāng)前節(jié)點(diǎn)設(shè)置全局唯一的ID號
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1
4. 指向主節(jié)點(diǎn)(從節(jié)點(diǎn))
mysql -uroot -p000000
CHANGE MASTER TO MASTER_HOST='172.16.77.132',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='localhost-bin.000007',
MASTER_LOG_POS=154;
管理節(jié)點(diǎn):
1. 驗(yàn)證配置
masterha_check_ssh --conf=/etc/mha/app1.conf
masterha_check_repl --conf=/etc/mha/app1.conf
2. 啟動(dòng)進(jìn)程
masterha_manager --conf=/etc/mha/app1.conf
測試:
1. 模擬主節(jié)點(diǎn)故障
/etc/init.d/mysqld stop ##主節(jié)點(diǎn)執(zhí)行
2. 查看主從狀態(tài)
[root@localhost ~]# mysql -uroot -p000000 -e "show slave status\G" ##從節(jié)點(diǎn)執(zhí)行
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.77.131
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000017
Read_Master_Log_Pos: 194
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 375
Relay_Master_Log_File: localhost-bin.000017
Slave_IO_Running: Yes
Slave_SQL_Running: Yes