Mysql備份:
備份系統的構建,要注意的要點:
第一:能容忍最多丟失多少數據;
第二:恢復數據需要在多長時間內完成;
第三:需要恢復哪些數據:備份時要考慮備份完整;
(1)必須做還原測試,用于測試備份的可用性;
(2)還原演練;不是一個人能夠完成的;
備份類型:
完全備份:就是備份整個數據集,是從時間軸上劃分的,完整數據集;;
部分備份:只備份數據子集;
增量備份:僅備份最近一次完全備份或增量備份(如果存在增量)以來變化的數據;備份的是從上一次備份為起點到備份時的變化的數據;問題是還原起來比較麻煩;但很節約空間;是從時間軸上的變化量來備份的;是相對上一次的數據變化;
差異備份:僅備份最近一次完全備份以來變化的數據;起點都是從完全備份到備份時的差異部分;還原時用完全備份+最后一個差異就ok了;
注意:在實際使用備份策略時,應該使用完全備份+差異備份,或完全備份+增量備份
根據備份時的業務系統能否在線分為:
熱備:備份過程中讀寫操作均可執行;技術復雜;
溫備:讀操作可執行,但寫操作不成;
冷備:讀寫操作均不可執行;
MyISAM存儲引擎:可溫備,不能熱備;
InnoDB存儲引擎:可熱備;內部支持快照;
InnoDB實現熱備是,當打算開始備份時,對整個數據做一次阻斷;內部做一個快照,而后就針對這個快照做備份就行了,InnoDB支持,因為它的每一次數據修改都有一個lsn日志序列號,但是MyISAM存儲引擎沒有,所以MyISAM存儲引擎就不能執行熱備;備份技術都跟存儲引擎是有關系的;
根據備份的方式分為:
物理備份:直接復制數據文件進行備份;
使用cp、tar命令復制數據;
邏輯備份:從數據庫中導出數據另存而進行的備份;
邏輯備份會轉換為文本數據后會丟失精度,占用更多空間,需要專用的客戶端才能進行;
物理備份,邏輯備份:與存儲引擎無關;
備份工具:
mysqldump:
邏輯備份工具,適用于所有存儲引擎,支持溫備不支持熱備;可用于完全備份、部分備份
對InnoDB存儲引擎支持熱備;是通過啟動一個大事務進行的,可能會備份一天一夜,由于時間長會導致嚴重的資源競爭;
cp,tar等復制歸檔工具:
備份容易實現,但是物理備份工具,適用于所有存儲引擎;只適用于冷備,可做完全備份、部分備份;
lvm的快照:
可實現幾乎熱備,借助于文件系統管理工具進行備份;
Mysqlhotcopy
幾乎冷備;僅適用于MyISAM存儲引擎;
mysql自帶的程序
現在除了mysql自己的庫使用MyISAM存儲引擎,其它很少有人使用了;
備份工具的選擇:
方案一:mysqldump+復制binlog:可進行遠程備份;
mysqldump:做完全備份;
復制binlog中指定時間范圍內的event;做增量備份;
說明:如果數據集很小(幾十兆到幾百兆),每周可使用mysqldump進行一次完全備份,然后每一天(每1或2小時等根據需要)使用start-datetime和stop-datatime中間,取得binlog中的事件導出保存在一個sql文件中,這樣來備份;也可從上一個完全備份開始一直到現在,就能實現差異,如果是從上一次完全備份或增量開始就能實現增量;這種方案一般比較慢,但支持遠程備份;
因為mysqldump是myslq協議的客戶端工具;mysqlbinlog又可以遠程讀取事件,就意味著,備份過程就可以遠程進行了;mysql就自帶了這些工具;所以,在較小的數據集范圍內,對數據精度要求不是特別苛刻,而且對于備份和恢復過程又要求不是特別嚴格場景中,開使用這個兩個工具做備份;
mysqldump命令:
客戶端命令,支持通過mysql協議連接至mysqld服務器;
事實上就是向mysql服務器發起一個全量查詢操作,把所有數據拿到本地以后,并且將讀取到的數據保存在文件中,從而完成備份操作的;
-A –all-databases:備份所有庫;
-B –databases:指明備份的哪個庫
mysqldump [OPTIONS] database [tables]
備份指定庫中的表,沒有生成create database語句
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p hellodb > ./hellodb
Enter password:
MyISAM存儲引擎:支持溫備,備份時要鎖定表;
-x, –lock-all-tables:鎖定所有庫的所有表,讀鎖;
mysqldump [OPTIONS] –all-databases [OPTIONS]
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x –all-databases > ./hellodb4
Enter password: //輸入mysql的密碼
-l, –lock-tables:鎖定指定庫所有表;
mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -l –databases hellodb > ./hellodb3
Enter password:
InnoDB存儲引擎:支持溫備和熱備;
–single-transaction:創建一個事務,基于此快照執行備份;
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p –single-transaction –databases hellodb > ./hellodb2
Enter password:
注意:必須使用加鎖的方式進行備份,否則會造成數據不一致,使備份無法可用
其它必給選項:
–databases:指定備份是數據庫一個或多個;
–all-databases:備份所有數據庫;
–events, -E:備份指定數據庫相關的所有event scheduler;
–routines, -R:備份指定數據庫相關的所有存儲過程和存儲函數;
–triggers:備份表相關的觸發器;
–skip-triggers:不備份觸發器;
–master-data[=#]
0:表示不記錄
1:記錄為CHANGE MASTER TO語句,此語句不被注釋;
2:記錄為CHANGE MASTER TO語句,此語句被注釋;
–flush-logs:鎖定表完成后,即進行日志刷新操作;
實驗1::做一次mysqldump的備份及還原完全步驟:
1、先做一側完全備份
[root@centos7clean ~]# mysqldump -uroot -hlocalhost -p -x -A -R -E –master-data=2 –flush-logs –triggers > ./hellodb $(date +%F-%T)
Enter password:
在mysql做幾項修改
MariaDB [hellodb]> insert into students (name) values ('wang4');
Query OK, 1 row affected, 1 warning (0.01 sec)
MariaDB [hellodb]> drop table students;
Query OK, 0 rows affected (0.02 sec)
2、還原二進制日志:
[root@centos7clean ~]# mysqlbinlog /var/lib/mysql/master-log.000008 //查看drop表的起始位置
[root@centos7clean ~]# mysqlbinlog –stop-position 481 /var/lib/mysql/master-log.000008 > /root/binlog.sql //導出二進制日志在481的地方結束
MariaDB [hellodb]> set sql_log_bin = off; //還原時不記錄二進制文件中
MariaDB [hellodb]> \. /root/hellodb2016-11-19-14:21:01 //還原完全備份
MariaDB [hellodb]> \. /root/binlog.sql //還原二進制備份
MariaDB [hellodb]> set sql_log_bin = on; //開啟記錄二進制文件中
方案二:lvm2快照+復制binlog:不常用了解
lvm2快照:使用cp或tar等做物理備份;做完全備份;
復制binlog中指定時間范圍內的event;做增量備份;
這其實就是物理+邏輯的方式實現;因為cp是物理備份,而復雜binlog中的event在還原時是邏輯還原的,備份出來的數據也是邏輯的;
實驗步驟:
前提:數據目錄位于邏輯卷,包含了數據文件和事務日志;
(1) 請求鎖定所有表;
mysql> FLUSH TABLES WITH READ LOCK;
(2) 記錄二進制文件事件位置;
mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER STATUS;' >> /PATH/TO/SOME_POS_FILE
(3) 創建快照卷
lvcreate -L # -s -p r – SNAM-NAME /dev/VG-NAME/LV-NAME
(4) 釋放鎖
mysql> UNLOCK TABLES
(5) 掛載快照卷,并執行備份,備份完成后刪除快照卷;
(6) 周期性備份二進制日志;
基于lvm備份具體步驟:
對整個邏輯卷做一個快照,快照卷里面沒有內容,快照之后所有對原卷的修改時,需要先將原卷內容復制一份到快照卷上,再在原卷上修改;通過快照卷訪問的數據,如果原卷沒改仍然通過原卷來訪問,如果原卷改了的,將通過快照卷復制原卷修改之前的副本來訪問;
1.連接到mysql上,請求鎖定所有表:
> FLUSH TABLES WITH READ LOCK;
施加讀鎖,把所有表中的數據從內存同步到磁盤上;如果能請求到讀鎖,其它線程只能讀操作;如果此時,正有人在執行一個大事務,且正在做寫操作,此時就可能會等很長時間才能請求到讀鎖;
> SHOW MASTER STATUS;
2.鎖定后,滾動一次二進制日志;記錄二進制日志文件及事件位置:
> FLUSH LOGS;
# mysql -e 'SHOW MASTER STATUS' > /root/pos.`date +%F`
注意:二進制日志文件要從原卷中備份:
# cp -a /data/mysql/binlogs/ /tmp
3.為邏輯創建快照:
# lvcreate -L 2G -n mydata-snap -s -p r /dev/myvg/mydata
4.釋放全局讀鎖
> UNLOCK TABLES;
模擬數據庫變化,做些修改操作;
> USE hellodb;
> DELETE FROM students WHERE StuID=5;
> DELETE FROM students WHERE StuID=6;
> DELETE FROM students WHERE StuID=11;
> SELECT * FROM students;
5.掛載快照卷并備份
掛載快照卷:
# mount -r /dev/myvg/mydata-snap /mnt
備份數據文件
# cp -a mysql/ /tmp
注意:二進制日志文件要從原卷中備份:
6.刪除快照卷
# umount /mnt
# lvremove /dev/myvg/mydata-snap
模擬數據庫服務器崩潰:
# systemctl stop mariadb.service
# rm -rf /data/mysql/*
模擬數據文件崩潰;
# rm -rf /data/binlogs/*
模擬二進制日志文件崩潰;
演示基于lvm還原:
1.還原數據文件:
# cp -a /tmp/mysql/* /data/mysql/
還原數據文件;即直接拷貝回來;
確保復制回來以后,文件的屬主、屬組是mysql;
2.啟動服務
# systemctl start mariadb.service
> SHOW BINARY LOGS;
> USE hellodb;
> SELECT * FROM students;
崩潰前的數據;
3.讀取二進制日志文件中備份的事件位置
# cat /pos-2016-06-05
File Position Binlog_Do_DB Binlog_Ignore_DB
mysql-bin.000004 245
4、在備份的二進制日志文件中找到mysql-bin.000004文件,從245位置后面,讀出所有事件,然后保存在一個sql文件中;
# mysqlbinlog –start-position=245 mysql-bin.000004 > recovery.sql
5.重放事件:
# mysql < recovery.sql
方案三:xtrabackup:支持完全備份、增量備份;
由percona提供的支持InnoDB做熱備,是物理備份的工具;
可以理解為復制底層數據塊,而非簡單的復制文件
MyISAM:溫備,不支持增量備份;
InnoDB:熱備,增量;
實驗2.1:
1、安裝xtrabackup
[root@centos7clean ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm
2、新建目錄并備份
[root@centos7clean ~]# mkdir /mydata
[root@centos7clean ~]# innobackupex –user=root –password= /mydata
生成的文件說明:
[root@centos7clean 2016-11-19_15-19-55]# cat backup-my.cnf
備份了還原時的基本特性
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=5242880
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_binlog_info
master-log.000008 594 //備份時那一刻二進制文件和position
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_info
備份時程序自己的一些相關信息
uuid = 864f15ea-acec-11e6-89ee-000c299ef417
name =
tool_name = innobackupex //備份的程序
tool_command = –user=root –password=… /mydata //賬號等信息
tool_version = 2.3.2 //程序的版本號
ibbackup_version = 2.3.2
server_version = 5.5.44-MariaDB-log
start_time = 2016-11-19 15:19:56 //啟動時間
end_time = 2016-11-19 15:19:58 //結束時間
lock_time = 0
binlog_pos = filename 'master-log.000008', position '594'
innodb_from_lsn = 0
innodb_to_lsn = 9375874
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
[root@centos7clean 2016-11-19_15-19-55]# cat xtrabackup_checkpoints
文件的核查點
backup_type = full-backuped //備份的類型
from_lsn = 0
to_lsn = 9375874
last_lsn = 9376086
compact = 0
recover_binlog_info = 0
3、還原到10.1.72.50
開啟mariadb服務
50:[root@localhost ~]# systemctl stop mariadb //在目標主機上還原明mysql不能啟動
[root@ ~]# yum -y install ./percona-xtrabackup-2.3.2-1.el7.x86_64.rpm
60:[root@ mydata]# scp -rp 2016-11-19_15-19-55/ 10.1.72.50:/mydata
[root@ ~]# scp percona-xtrabackup-2.3.2-1.el7.x86_64.rpm 10.1.72.50:/root
——————
[root@localhost mysql]# innobackupex –apply-log /mydata/2016-11-19_15-19-55/ //應用日志,該提交提交該回滾回滾
[root@localhost mydata]# innobackupex –copy-back /mydata/backup/2016-11-19_15-19-55/
此處特別注意:
在/etc/my.cnf中必須指定、datadir=要恢復的目錄
4、更改mysql數據目錄的屬主屬組
[root@localhost mydata]# chown -R mysql.mysql /var/lib/mysql/
5、修改my.cnf
由xtrabackup還原后innodb事務日志的大小改為48m,原mysql默認為5m
不匹配,所以要修改innodb_log_file_size參數
-rw-r—– 1 mysql mysql 50331648 Nov 6 21:44 ib_logfile0
-rw-r—– 1 mysql mysql 50331648 Nov 6 21:44 ib_logfile1
[root@localhost mysql]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
——————-
實驗2.2
MariaDB [hellodb]> insert into students (name) values ('wang5');
Query OK, 1 row affected, 1 warning (0.01 sec)
1.做增量備份
[root@centos7clean mydata]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_15-19-55
–incremental:明確指明做增量備份
–incremental-basedir:基于上次備份的哪個目錄做增量備份
[root@centos7clean 2016-11-19_17-11-32]# less xtrabackup_checkpoints
2.再次修改數據
MariaDB [hellodb]> delete from students where stuid=31;
Query OK, 1 row affected (0.01 sec)
3.再做一次增量備份
[root@centos7clean 2016-11-19_17-11-32]# innobackupex –user=root –password= –incremental /mydata –incremental-basedir=/mydata/2016-11-19_17-11-32
查看記錄到哪個binlog
[root@centos7clean 2016-11-19_17-21-22]# less xtrabackup_binlog_info
master-log.000008 1029
4.再做修改
MariaDB [hellodb]> insert into students (name) value ('wang6');
Query OK, 1 row affected, 1 warning (0.30 sec)
5.導出二進制文件
[root@centos7clean mysql]# mysqlbinlog –start-position=1029 master-log.000008 > /mydata/binlog.sql
6.還原:
[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/
–redo-only:只提交不回滾
7.合并第一次增量
[root@localhost mydata]# innobackupex –apply-log –redo-only 2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-11-32 //
8.合并第二次增量
[root@localhost mydata]# innobackupex –apply-log 2016-11-19_15-19-55/ –incremental-dir=/mydata/2016-11-19_17-21-22
注意:這是redo-only不寫
9.復制文件:
[root@localhost mydata]# innobackupex –copy-back /mydata/2016-11-19_15-19-55/
10.導入二進制sql語句
MariaDB [hellodb]> \. /mydata/binlog.sql
Mysql復制:
1.主/從架構:
異步復制:
半同步復制:
一主多從;
一從一主;
級聯復制;
循環復制;
雙主復制;
1.1配置在主服務器上
1.同步時間
[root@localhost mydata]# ntpdate 10.1.0.1
2. 修改mysql配置文件
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server_id=1
log_bin=master-log
3.配置一個從服務器的授權
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
1.2在從服務器上
[root@localhost mydata]# !vim
vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
server_id=2
relay_log=slave-log
innodb_file_per_table=on
啟動服務
指明主服務器:
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;
查看從服務器狀態
開啟從服務器
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000009',master_log_pos=245;
MariaDB [(none)]>start slave;
驗證:
設置從服務器為只讀
MariaDB [hellodb]> set @@global.read_only=1;
2、主主模式
互為主從:兩個節點各自都要開啟binlog和relay log;
1、數據不一致;
2、自動增長id;
定義一個節點使用奇數id
auto_increment_offset=1
auto_increment_increment=2
另一個節點使用偶數id
auto_increment_offset=2
auto_increment_increment=2
節點1:
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
relay_log=relay-log
auto_increment_offset=1
auto_increment_increment=2
授權
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
指向另一個節點為主:
MariaDB [(none)]> change master to master_host='10.1.72.50',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;
MariaDB [(none)]> start slave;
節點2:
[root@centos ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
relay_log=relay-log
auto_increment_offset=2
auto_increment_increment=2
授權:
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.60' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
指向另一臺為主:
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=245;
MariaDB [(none)]> start slave;
復制時應該注意的問題:
1、盡量確保復制時的事務安全
在master節點啟用參數:
sync_binlog = ON
立刻將二進制日志寫入磁盤中
如果用到的是InnoDB存儲引擎:
innodb_flush_logs_at_trx_commit=ON將事務日志寫入磁盤
innodb_support_xa=ON支持分布式事務
2、從服務器意外中止時盡量避免自動啟動復制線程
3、從節點:設置參數
sync_master_info=ON
sync_relay_log_info=ON
聲明:最好不要使用主主模式
3、半同步復制
支持多種插件:/usr/lib64/mysql/plugins/
主節點:
[root@centos7clean ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
[root@centos7clean ~]# systemctl start mariadb
[root@centos7clean ~]# mysql
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.%' identified by '123';
MariaDB [(none)]> flush privileges;
安裝插件
MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
MariaDB [(none)]> show plugins;
MariaDB [(none)]> show global variables like 'rpl_semi%';
開啟半同步復制
MariaDB [(none)]> set @@global.rpl_semi_sync_master_enabled=on;
查看是否有從節點:
MariaDB [(none)]> show global status like '%semi%';
從節點:
[root@localhost mydata]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
server_id=2
relay_log=slave-log
[root@localhost mydata]# systemctl start mariadb
[root@localhost mydata]# mysql
MariaDB [(none)]> change master to master_host='10.1.72.60' ,master_user='user',master_password='123',master_log_file='master-log.000003',master_log_pos=486;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
安裝插件
MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
啟動服務
MariaDB [(none)]> set @@global.rpl_semi_sync_slave_enabled = on;
停止服務
Stop slave;
開啟服務
Start slave;
復制過濾器:
僅復制有限一個或幾個數據庫相關的數據,而非所有;由復制過濾器進行;
有兩種實現思路:
(1) 主服務器
主服務器僅向二進制日志中記錄有關特定數據庫相關的寫操作;
問題:其它庫的point-recovery將無從實現;
binlog_do_db=白名單,復制哪個數據庫
binlog_ignore_db=黑名單,忽略哪個數據庫
(2) 從服務器
從服務器的SQL THREAD僅重放關注的數據庫或表相關的事件,并將其應用于本地;問題:網絡IO和磁盤IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
將這些參數寫入到配置文件中即可;
半同步復制哪些參數想重啟生效,也要寫入到配置文件中
復制的監控和維護:
(1) 清理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
示例:
MariaDB [(none)]> purge binary logs to 'master-log.000003';
表示mysql-bin.03之前的所有日志都被清理;
MariaDB [(none)]> PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26' ;表示2008-04-02 22:46:26這個時間點之前的所有事件都被清理;
(2) 復制監控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務器是否落后于主服務器:
MariaDB [(none)]> show slave status\G;
Seconds_Behind_Master: 0
(3) 如何確定主從節點數據是否一致?
通過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum;
(4) 主人數據不一致時的修復方法?
重新復制;
綜合實驗:
主節點:
創建CA證書
[root@centos7clean CA]# (umask 077;openssl genrsa -out private/cakey.pem)
[root@centos7clean CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
[root@centos7clean mysql]# cd ssl/
[root@centos7clean ssl]# (umask 077;openssl genrsa -out mysql.key)
[root@centos7clean ssl]# openssl req -new -key mysql.key -out mysql.csr
[root@centos7clean ssl]# openssl ca -in mysql.csr -out mysql.crt
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server_id=1
log_bin=master-log
innodb_file_per_table = on
ssl
ssl_ca = /etc/pki/CA/cacert.pem
ssl_cert = /var/lib/mysql/ssl/mysql.crt
ssl_key = /var/lib/mysql/ssl/mysql.key
改變屬主屬組
[root@centos7clean ssl]# chown -R mysql.mysql *
MariaDB [(none)]> show variables like '%ssl%';
從節點:
[root@localhost ssl]# (umask 066;openssl genrsa -out mysql.key)
[root@localhost ssl]# openssl req -new -key mysql.key -out mysql.csr
[root@localhost ssl]# ls
mysql.csr mysql.key
[root@localhost ssl]# scp mysql.csr 10.1.72.60:/root
主節點簽署并發還從節點,更改屬主屬組
[root@localhost ssl]# chown mysql.mysql *
[root@localhost ssl]# ll
total 8
-rw-r–r– 1 mysql mysql 0 Nov 20 10:46 mysql.crt
-rw-r–r– 1 mysql mysql 643 Nov 20 10:37 mysql.csr
-rw——- 1 mysql mysql 887 Nov 20 10:37 mysql.key
將證書的公鑰cacert.pem復制到從服務器的目錄下
更改從節點配置文件:
[root@localhost ssl]# vim /etc/my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
symbolic-links=0
innodb_log_file_size = 50331648
server_id=2
ssl
ssl_ca=/etc/pki/CA/cacert.pem
ssl_cert=/var/lib/mysq/ssl/mysql.crt
ssl_key=/var/lib/mysql/ssl/mysql.key
relay_log=slave-log
啟動服務,主節點授權
MariaDB [(none)]> grant replication slave,replication client on *.* to 'user'@'10.1.72.50' identified by '123' require ssl;
MariaDB [(none)]> flush privileges;
備份主節點數據到從節點:
主:
備份數據
[root@centos7clean ~]# innobackupex –user='root' –password= /mydata
從:
停止服務,還原數據:
[root@localhost mysql]# innobackupex –apple-log /mydata/2016-11-20_11-13-51/
[root@localhost mysql]# rm -rf *
[root@localhost mysql]# innobackupex –copy-back /mydata/2016-11-20_11-13-51/
注意:恢復數據的時候是基于unix套接字的,所以要先創建mysql.sock
啟動服務,并指明主服務器
MariaDB [(none)]> change master to master_host='10.1.72.60',master_user='user',master_password='123',master_log_file='master-log.000011',master_log_pos=499,master_ssl=1,master_ssl_ca='/etc/pki/CA/cacert.pem',master_ssl_key='/var/lib/mysql/ssl/mysql.key',master_ssl_cert='/var/lib/mysql/ssl/mysql.crt';
Query OK, 0 rows affected (0.05 sec)
可以用[root@localhost ssl]# mysql –ssl -uuser -h10.1.72.60 -p123測試
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.72.60
Master_User: user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000012
Read_Master_Log_Pos: 245
Relay_Log_File: slave-log.000007
Relay_Log_Pos: 530
Relay_Master_Log_File: master-log.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 245
Relay_Log_Space: 1357
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/pki/CA/cacert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /var/lib/mysql/ssl/mysql.crt
Master_SSL_Cipher:
Master_SSL_Key: /var/lib/mysql/ssl/mysql.key
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
實驗:使用zabbix監控從服務器
實驗要求:
·
監控過濾Seconds_Behind_Master: 0,如果不等于0,則表示從服務器落后于主服務器,則發送警報并執行操作,在從服務器上執行命令:(mysql -e “stop slave io_thread;start slave io_thread”)
10.1.72.40:安裝zabbix
[root@localhost ~]#yum -y install ./zabbix-get-3.0.2-1.el7.x86_64.rpm ./zabbix-server-mysql-3.0.2-1.el7.x86_64.rpm ./zabbix-web-3.0.2-1.el7.noarch.rpm ./zabbix-web-mysql-3.0.2-1.el7.noarch.rpm
[root@localhost ~]#yum -y install php httpd php-mysql mariadb-server
[root@localhost ~]#vim /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=123
Agent端安轉并啟動服務,配置自定義key
[root@localhost mysql]# vim /etc/zabbix/zabbix_agentd.conf
# UserParameter=
UserParameter=Seconds_Behind_Master,mysql -uroot -hlocalhost -e 'show slave status\G;'|awk -F':' '/Seconds/ {print $2}'
添加主機,并建立一個item
關聯一個賬戶
定義動作:
測試:
從服務器添加一個讀鎖
MariaDB [(none)]> flush tables with read lock;
主服務器做操作
原創文章,作者:landanhero,如若轉載,請注明出處:http://www.www58058.com/60147