1. 程式人生 > 實用技巧 >學習MySql(一)

學習MySql(一)

一、安裝部署mysql

1、安裝mysql:

# yum -y install autoconf libaio libaio-devel
# groupadd mysql
# useradd -r -g mysql -s /sbin/nologin mysql
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz         #下載編譯完成的包,效能更可靠
# tar -zxvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz
# mv mysql
-5.6.36-linux-glibc2.5-x86_64 /usr/local/mysql-5.6.36 # ln -s /usr/local/mysql-5.6.36 /usr/local/mysql # chown -R mysql:mysql /usr/local/mysql-5.6.36/

2、建立配置檔案:

# vim /data/3306/my.cnf
[client] port
= 3306 socket = /data/3306/mysql.sock [mysql] no-auto-rehash [mysqld] user = mysql port
= 3306 socket = /data/3306/mysql.sock basedir = /usr/local/mysql datadir = /data/3306/data tmpdir = /tmp open_files_limit = 65535 character-set-server = utf8mb4 back_log = 500 max_connections = 3000 max_connect_errors = 10000 #table_cache = 6144 max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size
= 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 64M query_cache_type = 1 #default_table_type = InnoDB #transaction_isolation = READ-COMMITTED tmp_table_size = 512M max_heap_table_size = 256M table_open_cache = 512 log_error=/data/3306/mysql_3306.err slow_query_log_file = /data/3306/mysql-slow.log slow_query_log = 1 long_query_time =0.5 pid-file = /data/3306/mysql.pid log-bin = /data/3306/mysql-bin relay-log = /data/3306/relay-bin relay-log-info-file = /data/3306/relay-log.info binlog_cache_size = 2M binlog_format = row log-slave-updates max_binlog_cache_size = 4M max_binlog_size = 256M expire_logs_days = 7 #myisam_sort_buffer_size = 1M #myisam_max_sort_file_size = 10G #myisam_max_extra_sort_file_size = 10G #myisam_repair_threads = 1 #myisam_recover skip-name-resolve skip-host-cache replicate-ignore-db = mysql server-id = 71 innodb_additional_mem_pool_size = 8M innodb_buffer_pool_size = 16G #設定成記憶體的60-70%最好 innodb_data_file_path = ibdata1:128M;ibdata2:128M:autoextend innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 4M innodb_log_file_size = 2G innodb_log_files_in_group = 3 innodb_file_per_table = 1 [mysqldump] quick max_allowed_packet = 8M

3、初始化資料庫:

# chown mysql.mysql -R /data/3306/
# cd /usr/local/mysql/scripts/
# ./mysql_install_db \
--defaults-file=/data/3306/my.cnf \
--basedir=/usr/local/mysql/ \
--datadir=/data/3306/data/ --user=mysql

#新增環境變數
# echo 'export PATH=/usr/local/mysql/bin/:$PATH' >> /etc/profile
# source /etc/profile

4、啟動資料庫:

# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf &

5、設定資料庫密碼:

mysqladmin -uroot password Root123 -S /data/3306/mysql.sock

6、建立資料庫啟動指令碼:

#!/bin/sh  
port=3306  
mysql_user="root"  
mysql_pwd="Root123"  
cmdpath="/usr/local/mysql/bin"  
mysql_sock="/data/${port}/mysql.sock"  
#start function  
function_start_mysql()  
{  
    if [ ! -e "$mysql_sock" ];then  
      echo "starting mysql…" 
      /bin/sh ${cmdpath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /devull &  
    else  
      echo "mysql is running…"  
      exit  
    fi  
}  

#stop function  
function_stop_mysql()  
{  
    if [ ! -e "$mysql_sock" ];then  
       echo "mysql is stopped…"  
    else  
       echo "stoping mysql…"  
       ${cmdpath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown  
   fi  
}  

#restart function  
function_restart_mysql()  
{  
    echo "restarting mysql…"  
    function_stop_mysql  
    sleep 2  
    function_start_mysql  
}  

case $1 in  

start)  
    function_start_mysql  
;;  

stop)  
    function_stop_mysql  
;;  

restart)  
    function_restart_mysql  
;;  

*)  
    echo "usage: /data/${port}/mysql {start|stop|restart}"  
esac

二、mysql的備份恢復

1、Xtrabackup介紹

MySQL冷備:mysqldump,熱備:xtrabakackup有2個工具,分別是xtrabakup、innobakupe,支援MySQL、Percona server和MariaDB。
xtrabackup只能備份innoDB和xtraDB兩種資料引擎的表,而不能備份MyISAM資料表。

2、Xtrabackup優點

1 備份速度快,物理備份可靠
2 備份過程不會打斷正在執行的事務(無需鎖表)
3 能夠基於壓縮等功能節約磁碟空間和流量
4 自動備份校驗
5 還原速度快
6 可以流傳將備份傳輸到另外一臺機器上
7 在不增加伺服器負載的情況備份資料

3、Xtrabackup備份原理

Xtrabackup備份流程圖:

1 innobackupex啟動後,會先fork一個程序,用於啟動xtrabackup,然後等待xtrabackup備份ibd資料檔案;
2 xtrabackup在備份innoDB資料是,有2種執行緒:redo拷貝執行緒和ibd資料拷貝執行緒。xtrabackup程序開始執行後,會啟動一個redo拷貝的執行緒,用於從最新的checkpoint點開始順序拷貝redo.log;再啟動ibd資料拷貝執行緒,進行拷貝ibd資料。這裡是先啟動redo拷貝執行緒的。在此階段,innobackupex進行處於等待狀態(等待檔案被建立)
3 xtrabackup拷貝完成ibd資料檔案後,會通知innobackupex(通過建立檔案),同時xtrabackup進入等待狀態(redo執行緒依舊在拷貝redo.log)
4 innobackupex收到xtrabackup通知後哦,執行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位點,然後開始備份非InnoDB檔案(如frm、MYD、MYI、CSV、opt、par等格式的檔案),在拷貝非InnoDB檔案的過程當中,資料庫處於全域性只讀狀態。
5 當innobackup拷貝完所有的非InnoDB檔案後,會通知xtrabackup,通知完成後,進入等待狀態;
6 xtrabackup收到innobackupex備份完成的通知後,會停止redo拷貝執行緒,然後通知innobackupex,redo.log檔案拷貝完成;
7 innobackupex收到redo.log備份完成後,就進行解鎖操作,執行:UNLOCK TABLES;
8 最後innbackupex和xtrabackup程序各自釋放資源,寫備份元資料資訊等,innobackupex等xtrabackup子程序結束後退出。

4、xtrabackup的安裝部署

1) xtrabackup的yum安裝

1、yum安裝
下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/
# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm # yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

2)xtrabackup的二進位制安裝

這種安裝方法也很簡單,不象rpm包需要安裝依賴包,只需解壓安裝檔案,為了方便可建立軟連線。
1、檢查libgcrypt的版本:
# rpm -aq | grep libgcrypt

2下載XtraBackup 
# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/tarball/percona-xtrabackup-2.4.12-Linux-x86_64.libgcrypt145.tar.gz

3、解壓縮檔案
# tar xf percona-xtrabackup-2.4.12-Linux-x86_64.libgcrypt145.tar.gz
# mv  percona-xtrabackup-2.4.12-Linux-x86_64      /home/tom/xtr
# ln -s  /home/tom/xtr/bin/*     /home/tom/bin/

5、Xtrabackup工具介紹

1、引數選項
xtrabackup:是用於熱備innodb,xtradb表中資料的工具,不能備份其他型別的表,也不能備份資料表結構;
innobackupex:是將xtrabackup進行封裝的perl指令碼,提供了備份myisam表的能力。
常用選項:  
   --host                                   #指定主機
   --user                                   #指定使用者名稱
   --password                               #指定密碼
   --port                                   #指定埠
   --databases                              #指定資料庫
   --incremental                            #建立增量備份
   --incremental-basedir                    #指定包含完全備份的目錄
   --incremental-dir                        #指定包含增量備份的目錄   
   --apply-log                              #對備份進行預處理操作(備份後的資料,含有未提交的事務,通過回滾,保證資料一致性)
   --redo-only                              #不回滾未提交事務
   --copy-back                              #恢復備份目錄
   --no-timestamp                           #不建立以時間命名的目錄(預設以時間命名)

2、innobackupex檔案介紹  
使用innobackupex備份時,會呼叫xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關檔案(.frm)、
以及MyISAM、MERGE、CSV和ARCHIVE表的相關檔案,同時還會備份觸發器和資料庫配置資訊相關的檔案
1)xtrabackup_checkpoints
  備份型別(完全或增量)、備份狀態(是否已為prepared狀態)和LSN(日誌序列號)範圍資訊
  每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號,即LSN,LSN是整個資料庫系統的系統版本號
2)xtrabackup_binlog_info 
  二進位制日誌檔案及位置點
3)xtrabackup_binlog_pos_innodb 
  二進位制日誌檔案及用於InnoDB或XtraDB表的二進位制日誌檔案的當前position
4)xtrabackup_binary  
  備份中用到的xtrabackup的可執行檔案
5)backup-my.cnf 
  備份命令用到的配置選項資訊

6、建立一個最小許可權的備份使用者

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';  
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';         
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';  
mysql> FLUSH PRIVILEGES;  

7、xtrabackup全量備份與恢復

備份:
# innobackupex --user=bkpuser --password=123456 --defaults-file=/etc/my.cnf  /BACKUP-DIR/
# innobackupex -uroot -p123456 -H127.0.0.1 --stream=tar /tmp  >/home/tom/all.tar            #非壓縮方式
# innobackupex -uroot -p123456 -H127.0.0.1 --stream=tar /tmp | gzip  >/home/tom/all.tar.gz  #壓縮方式

恢復:
# innobackupex --apply-log   /backups/2018-07-30_11-04-55/
# innobackupex --copy-back --defaults-file=/etc/my.cnf  /backups/2018-07-30_11-04-55/ 
# innobackupex --move-back --defaults-file=/etc/my.cnf  /backups/2018-07-30_11-04-55/

備份到遠端
# innobackupex -uroot -p123456 -H127.0.0.1 --stream=tar /tmp | sshpass -p '123456' ssh root@IP "cat - > /root/all.tar"   #非壓縮方式
# innobackupex -uroot -p123456 -H127.0.0.1 --stream=tar /tmp | sshpass -p '123456' ssh root@IP "gzip > /root/all.tar"    #壓縮方式
注意:解壓時tar +i引數, tar -xizf  all.tar.gz

8、全量備份與恢復示例

1) 全量備份
# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/  
# ll 2018-07-30_11-01-37/   -rw-r----- 1 root root 418 Jul 30 11:01 backup-my.cnf   #備份用到的配置選項資訊檔案 -rw-r----- 1 root root 79691776 Jul 30 11:01 ibdata1   #資料檔案
-rw-r----- 1 root root 21 Jul 30 11:01 xtrabackup_binlog_info  #mysql伺服器當前正在使用的二進位制日誌檔案及位置點 -rw-r----- 1 root root 113 Jul 30 11:01 xtrabackup_checkpoints  #備份的型別、狀態和LSN狀態資訊檔案 -rw-r----- 1 root root 482 Jul 30 11:01 xtrabackup_info -rw-r----- 1 root root 2560 Jul 30 11:01 xtrabackup_logfile     #備份的日誌檔案 2) 恢復 # /etc/init.d/mysqld stop   # yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm    # scp -r 2018-07-30_11-01-37/ root@192.168.56.12:/backups/   # innobackupex --apply-log /backups/2018-07-30_11-01-37/      #合併資料,使資料檔案處於一致性的狀態# rm -rf /usr/local/mysql/data/   #在slave上刪除原有的資料# innobackupex --copy-back /backups/2018-07-30_11-01-37/   #在slave上資料恢復
# chown -R mysql.mysql /usr/local/mysql/data/  # /etc/init.d/mysqld start   # mysql -uroot -p -e "show databases;"  

注意:備份時需啟動MySQL,恢復時需關閉MySQL,清空mysql資料目錄,且不能重新初始化

9、xtrabackup增量備份與恢復

1、增量備份(基於全量備份)
# innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37

2、合併全備資料 # innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37
3、合併增量資料 # innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37 --incremental-dir=/backups/2018-07-30_13-51-47/

4、
恢復 # innobackupex --copy-back --defaults-file=/etc/my.cnf /opt/2017-01-05_11-04-55/
5、備註:
1) 2018-07-30_11-01-37 是全備的目錄。
2) 2018-07-30_13-51-47 是增量備份的目錄,如果有多次增量備份,每一次都要執行如上操作

10、增量備份與恢復例項

1、全備
# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/   

2、增量備份
# innobackupex --user=root --password=123456 --host=127.0.0.1 --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37/

3、檢視檔案
drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37   #全量備份資料目錄
drwxr-x--- 8 root root 273 Jul 30 13:51 2018-07-30_13-51-47   #增量備份資料目錄
# cat xtrabackup_checkpoints                                 
  backup_type = full-backuped                                #備份型別為全量備份
  from_lsn = 0                                               #lsn從0開始
  to_lsn = 3127097                                           #lsn到3127097結束
  last_lsn = 3127097
# cat xtrabackup_checkpoints       
  backup_type = incremental                                  #備份型別為增量備份
  from_lsn = 3127097                                         #lsn從3127097開始
  to_lsn = 3158741                                           #lsn到啊3158741結束
  last_lsn = 3158741  

4、模擬故障,刪除資料目錄所有資料
# /etc/init.d/mysqld stop                                    
# rm -rf /usr/local/mysql/data/*  

5、合併全備
# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/

6、合併增量,確保資料的一致性
# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/ --incremental-dir=/backups/2018-07-30_13-51-47/
# cat /backups/2018-07-30_11-01-37/xtrabackup_checkpoints 
backup_type = log-applied                                    #檢視到資料備份型別是增加
from_lsn = 0              
to_lsn = 3158741            
last_lsn = 3158741

7、恢復資料
# innobackupex --copy-back  /backups/2018-07-30_11-01-37/
# chown -R mysql.mysql /usr/local/mysql/data  
# /etc/init.d/mysqld start                    
# mysql -uroot -p -e "show databases;"       
 

三、mysql主從同步

##################################################

1.環境準備

[root@db01 ~]# hostname ;hostname -I
db01
10.0.0.51 172.16.1.51
[root@db02 ~]# hostname ;hostname -I
db02
10.0.0.52 172.16.1.52 
#兩臺伺服器均安裝以下軟體包。
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm
yum -y localinstall percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm
-- 建立測試環境
create database oldboy;
use oldboy
drop table test;
CREATE TABLE test (
id int(4) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
PRIMARY KEY (id)
) ;
insert into test(id,name) values(1,'oldboy');
insert into test(name) values('oldgirl');
insert into test values(3,'inca');
insert into test values(4,'zuma'),(5,'kaka');

這裡db01為主庫,db02為從庫,從庫裡沒有資料。現在要實現的是db01到db02的主從複製。server id不能相同,同時開啟binlog功能

2. 備份

先在db01上做一次全備

[root@db01 ~]# innobackupex --defaults-file="/etc/my.cnf" --user=root --socket=/application/mysql/tmp/mysql.sock --password=123456 /opt/
#現在資料已經備份到opt下面了

#把備份好的資料複製到db02的opt目錄下
[root@db01 ~]#  scp -r /opt/2017-05-05_11-23-50/ 10.0.0.52:/opt/

3.db01插入資料

在做完備份後,在生產環境中一般都會有資料繼續寫入資料庫,所以這裡再插入幾條資料模擬環境。

use oldboy;
insert into test(id,name) values(6,'bing');
insert into test(id,name) values(7,'zhao');
insert into test(id,name) values(8,'ya');
insert into test(id,name) values(9,'ting');

4.預處理

[root@db02 ~]# sed -i '16a datadir = /application/mysql/data' /application/mysql/my.cnf
[root@db02 opt]# innobackupex --defaults-file="/etc/my.cnf" --user=root --socket=/application/mysql/tmp/mysql.sock --password=123456 --apply-log --use-memory=200M /opt/2017-05-05_09-35-07/
#注:--use-memory引數可以設定適用記憶體進行處理,如果伺服器記憶體夠大,多給一點是沒問題的,可以加快處理速度。

5.db02

#刪除原有的資料檔案,必須先清空原有資料檔案,不然後報錯
[root@db02 mysql]# mv /application/mysql/data /tmp/

#匯入db01的資料檔案
[root@db02 mysql]# innobackupex --defaults-file="/etc/my.cnf" --user=root --socket=/application/mysql/tmp/mysql.sock --move-back /opt/2017-05-05_11-23-50/

#可以看到剛才被刪除的資料又恢復過來了
[root@db02 data]# cat xtrabackup_binlog_pos_innodb 
mysql-bin.000002    1461
[root@db02 mysql]# chown -R mysql.mysql data
[root@db02 mysql]# /etc/init.d/mysqld start

6.建立主從同步授權使用者

-- 在db01上
mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';

7.做主從同步

-- db02
mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=1461;
mysql> start slave;
#檢查
[root@db02 mysql]# mysql -uroot -poldboy123 -e "show slave status\G"|egrep -i "Yes|Behind_Master"
Warning: Using a password on the command line interface can be insecure.
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
        Seconds_Behind_Master: 0

8.檢查資料

9.延時複製

mysql自帶還有延時複製的功能,比如在一主4從的時候,可以將其中一臺做延時複製,假如出現意外情況或誤操作,延時複製的功能還有一絲恢復資料的機會。

mysql> change master to master_delay = 3600;    -- 等於你想要延遲的時間
mysql> start slave;

-- 表示從庫延遲1小時後同步資料
mysql> show slave status\G
                    SQL_Delay: 3600
          SQL_Remaining_Delay: 3561

###################################################

1.主從複製

主庫:

1)修改配置檔案

#編輯mysql配置檔案my.cnf

[mysqld]
server-id=1         #不能用從庫相同
log_bin=mysql-bin   #開啟日誌

2)建立主從複製使用者

建立rep使用者

mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by 'oldboy123';

3)檢視主庫binlog位置點

show master status;

從庫:

1)修改配置檔案

#修改db02配置檔案my.cnf

[mysqld]
server-id=2
read_only=1

2)配置主從

mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='oldboy123',master_auto_position=1;master_log_file='mysql-bin.000002',master_log_pos=1558;
mysql> start slave;
mysql> set global read_only=1; #從庫只讀

2、延時同步

企業中一般會延時3-6小時

1)延時從庫配置方法

#停止主從
#設定延時為180秒    mysql>CHANGE MASTER TO MASTER_DELAY = 180;
#開啟主從
#檢視狀態          SQL_Delay: 60

總資料量級500G,正常備份去恢復需要1.5-2小時
2)怎麼利用延時從庫,恢復資料?

1、停止SQL執行緒
mysql> stop slave sql_thread;

2、擷取relaylog到誤刪除之前點
relay-log.info 獲取到上次執行到的位置點,作為恢復起點
分析relay-log的檔案內容,獲取到誤刪除之前position

模擬故障

1)從庫,關閉SQL執行緒
mysql > stop slave sql_thread;

2)擷取relay-log
起點:
cat /data/3308/data/relay-log.info
 /db01-relay-bin.000002283
終點:
mysql > show relaylog events in 'db01-relay-bin.000002'
db01-relay-bin.000002 | 268047

3)匯出sql # mysqlbinlog
--start-position=283 --stop-position=268047 /data/3308/data/db01-relay-bin.000002 >/tmp/relay.sql 4)恢復relay.sql mysql> set sql_log_bin=0; mysql> source /tmp/relay.sql mysql> show tables;

3、半同步複製

半同步複製開啟方法

1)主庫

#檢視是否有動態支援
mysql> show global variables like 'have_dynamic_loading';

#安裝自帶外掛 mysql
> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so'; #啟動外掛 mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #設定超時(毫秒) mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #修改配置檔案 my.cnf [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 檢查安裝: mysql> show variables like'rpl%'; mysql> show global status like 'rpl_semi%'

2)從庫

#安裝slave半同步外掛
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';

#啟動外掛
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

#重啟io執行緒使其生效
mysql> stop slave io_thread; start slave io_thread;

#編輯配置檔案 my.cnf
[mysqld]
rpl_semi_sync_slave_enabled =1

注:相關引數說明

rpl_semi_sync_master_timeout=milliseconds
設定此引數值(ms),為了防止半同步複製在沒有收到確認的情況下發生堵塞,如果Master在超時之前沒有收到任何確認,將恢復到正常的非同步複製,並繼續執行沒有半同步的複製操作。

rpl_semi_sync_master_wait_no_slave={ON|OFF}
如果一個事務被提交,但Master沒有任何Slave的連線,這時不可能將事務傳送到其它地方保護起來。預設情況下,Master會在時間限制範圍內繼續等待Slave的連線,並確認該事務已經被正確的寫到磁碟上。
可以使用此引數選項關閉這種行為,在這種情況下,如果沒有Slave連線,Master就會恢復到非同步複製。

3)測試半同步

#建立兩個資料庫,test1和test2
mysql> create database test1;
mysql> create database test2;

#檢視複製狀態
mysql> show global status like 'rpl_semi%';

#關閉半同步(1:開啟 0:關閉)
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 0;

#檢視半同步狀態
mysql> show global status like 'rpl_semi%';

#再一次建立兩個庫
mysql> create database test3;
mysql> create database test4;

#再一次檢視半同步狀態
mysql> show global status like 'rpl_semi%';

注:不難發現,在查詢半同步狀態是,開啟半同步,查詢會有延遲時間,關閉之後則沒有

4、過濾複製

主庫:

白名單:只記錄白名單中列出的庫的二進位制日誌

  • binlog-do-db

黑名單:不記錄黑名單列出的庫的二進位制日誌

  • binlog-ignore-db

從庫:

白名單:只執行白名單中列出的庫或者表的中繼日誌

  • --replicate-do-db=test
  • --replicate-do-table=test.t1
  • --replicate-wild-do-table=test.t2

黑名單:不執行黑名單中列出的庫或者表的中繼日誌

  • --replicate-ignore-db
  • --replicate-ignore-table
  • --replicate-wild-ignore-table

7、使用percona-monitoring-plugins外掛監控mysql5.6

zabbix-agent端

1、zabbix-agent端(被監控的Mysql伺服器)
1) 安裝php環境
# yum install zabbix-agent php php-mysql
2) 安裝percona外掛
# rpm -ivh https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.7/binary/redhat/6/x86_64/percona-zabbix-templates-1.1.7-2.noarch.rpm
3) 配置引數
# mkdir -p /etc/zabbix/zabbix_agentd.d
# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/userparameter_percona_mysql.conf
4) 將模板include到配置檔案中
# vim /etc/zabbix/zabbix_agentd.conf
  Include=/etc/zabbix/zabbix_agentd.d/
5) 重啟服務
service zabbix-agent restart

2、修改監控相關的指令碼(被監控的Mysql伺服器)
1) 新增監控使用者
mysql> GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY 'zabbixpassword'; 
mysql> flush privileges;
2) 編輯監控的php配置檔案
# vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf
  <?php
  $mysql_user = 'zabbix'; 
  $mysql_pass = 'zabbixpassword';
3) 編輯ss_get_mysql_stats.php檔案
# vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
  $mysql_user = 'zabbix';
  $mysql_pass = 'zabbixpassword';
  $mysql_port = 3306;
  $mysql_socket = "/tmp/mysql.sock";

3、在zabbix-agent客戶端測試(要能獲取資料,否則無法獲取監控資料)
# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh nj
# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gw

zabbix-server web端操作

1)匯入監控模板

2)修改日誌許可權

chown -R zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt

3)新增客戶端模板

4)通過服務端驗證是否生效,並檢視影象

# zabbix_get -s 192.168.3.12 -k MySQL.file-reads
# zabbix_get -s 192.168.3.12 -k MySQL.os-waits

監控mysql主從

1、在slave的節點,修改slave上的監控指令碼
# vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
  RES=`HOME=~zabbix mysql -h192.168.3.13 -uzabbix -pzabbixpassword -S /tmp/mysql.sock 
     -e 'SHOW SLAVE STATUS\G' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`

2、監控主從同步
1) 監控主從同步狀態 
UserParameter=MySQL.running-slave,/usr/local/zabbix_agents_3.2.0/scripts/get_mysql_stats_wrapper.sh running-slave
2) 主從延遲多少秒
UserParameter=MySQL.slave-lag,/usr/local/zabbix_agents_3.2.0/scripts/get_mysql_stats_wrapper.sh jj
3) 要注意php的路徑
CMD="/usr/local/php/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items gg"
4) 執行的時候發出警告,會報錯:不支援的key
# /usr/local/zabbix_agents_3.2.0/scripts/get_mysql_stats_wrapper.sh running-slave
# zabbix_get -s 1.1.1.1 -p 10050 -k 'MySQL.running-slave'
5) 解決辦法:
RES=`HOME=/usr/local/zabbix_agents_3.2.0/scripts /usr/local/mysql/bin/mysql -S /tmp/mysql.sock 
    -e 'SHOW SLAVE STATUS\G' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '\n' ','`
語句中接入HOME目錄,並且在該目錄下建立.my.cnf檔案,將賬戶密碼寫入這個檔案,mysql在連線資料庫的時候就會去讀取這個檔案,就繞過了不安全的提示
# cat /usr/local/zabbix_agents_3.2.0/scripts/.my.cnf 
[client]
user=zabbix
password=zabbix

3、測試報警
mysql> stop slave;