1. 程式人生 > >MYSQL 完全備份、主從復制、級聯復制、半同步

MYSQL 完全備份、主從復制、級聯復制、半同步

-a 不返回 數據庫分離 rm -rf 是否 sin ice 備份數據庫 var

mysql 完全備份
1,啟用二進制日誌,並於數據庫分離,單獨存放
    vim /etc/my.cnf
        添加
        log_bin=/data/bin/mysql-bin
    創建/data/bin文件夾並授權
        chown mysql.mysql /data/bin

2,完成備份數據庫
    mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz

3,對數據庫進行增刪改
    INSERT hellodb.students(stuid,name,gender,age) VALUE(27,‘Lujunyi‘,‘M‘,30);

4,停止MySQL
    systemctl stop mariadb.service

5,解壓備份文件
    unxz /data/all.sql.xz    

6,查找完全備份時二進制日誌的位置
    vim /data/all.sql 
        HANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001‘, MASTER_LOG_POS=468

7,導出完成備份後的二進制日誌
    mysqlbinlog --start-position=468 /data/bin/mysql-bin.000001 > /data/inc.sql

8,還原數據
    mysql -e ‘source /data/all.sql‘
    mysql -e ‘source /data/inc.sql‘

9,驗證完成。

誤刪除的恢復

1,啟用二進制日誌並與數據庫分開存放
    vim /etc/my.cnf
        添加
        log_bin=/data/bin/mysql-bin
    創建/data/bin文件夾並授權
        chown mysql.mysql /data/bin

2,對數據庫進行完全備份
    mysqldump -A --single-transaction --master-data=2 | xz > /data/all.sql.xz

3,對數據庫進行增刪改
    mysql -e "drop table hellodb.students"
     mysql -e "insert hellodb.teachers value (5,‘wangqi‘,50,‘M‘)"

4,停止服務
    systemctl stop mariadb.service

5,刪除數據庫
    rm -rf /var/lib/mysql/*

6,解壓備份文件
     unxz /data/all.sql.xz

7,查看備份文件,查找二進制節點
        vim /data/all.sql
            -- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000004‘, MASTER_LOG_POS=521902;

8,導出二進制日誌節點數據
    mysqlbinlog --start-position=521902 /data/bin/mysql-bin.000004 >/data/inc.sql

9,刪除二進制日誌節點數據中誤操作的命令
    vim /data/inc.sql
        DROP TABLE `hellodb`.`students` /* generated by server */
10,啟動服務 
    systemctl start mariadb.service

11.關閉二進制日誌記錄
    mysql -e "SET sql_log_bin=off"

12,導入備份數據
    mysql </data/all.sql 
    mysql </data/inc.sql 

13,驗證完成。

主從復制

# 主服務器
1,主服務器啟用二進制日誌,並更改二進制目錄
    vim /etc/my.cnf
        log_bin=/data/bin/mysql-bin
        binlog-format=row
        server-id=1(主從服務器必需保證不同)
    更改目錄見上面

2,重啟服務
    service mysql restart

3,創建一個賬戶用來復制數據的賬戶
    mysql -e ‘GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"

4,查看主服務器正在使用的二進制日誌
    show master logs;
        +------------------+-----------+
        | Log_name         | File_size |
        +------------------+-----------+
        | mysql-bin.000001 |     14383 |
        +------------------+-----------+
        1 row in set (0.00 sec)

# 從服務器
5,更配置
    vim /etc/my.cnf
        server-id=2
        read-only
        #log-bin=/data/bin/mysql-bin

6,啟動服務
    service mysql restart

7,關聯主服務
    MariaDB [(none)]>
    CHANGE MASTER TO    MASTER_HOST=‘172.22.7.70‘,    MASTER_USER=‘repluser‘,     MASTER_PASSWORD=‘centos‘,     MASTER_PORT=3306,     MASTER_LOG_FILE=‘mysql-bin.000001‘,    MASTER_LOG_POS=14383;

8,查看從服務器狀態
    show slave status\G;

9,啟動線程
    start slave;

#測試
10,增刪改主服務器數據,查看從服務器數據是否同步。

主從復制出錯的解決-sql_slave_skip_counter

#master服務 ip=172.22.7.70
1,主服務器啟用二進制日誌,並更改二進制目錄
    vim /etc/my.cnf
        log_bin=/data/bin/mysql-bin
        binlog-format=row
        server-id=1(主從服務器必需保證不同)
    更改目錄見上面

2,重啟服務
    service mysql restart

3,創建一個賬戶用來復制數據的賬戶
    mysql -e ‘GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"

4,查看主服務器正在使用的二進制日誌
    mysql -e ‘show master logs;‘
        +------------------+-----------+
        | Log_name         | File_size |
        +------------------+-----------+
        | mysql-bin.000001 |       264 |
        | mysql-bin.000002 |       245 |
        +------------------+-----------+

#slave服務 ip=172.22.7.71
5,修改配置文件,啟動服務
    vim /etc/my.cnf
        [mysqld]
        server-id = 2
        read-only
    systemctl start mariadb

#配置錯誤master服務信息
6,配置,change master to
    CHANGE MASTER TO 
    MASTER_HOST=‘172.22.7.77‘,  
    MASTER_USER=‘wang‘,     
    MASTER_PASSWORD=‘lodman‘,
    MASTER_PORT=3306, 
    MASTER_LOG_FILE=log-bin.001‘, 
    MASTER_LOG_POS=4, 
    MASTER_CONNECT_RETRY=10;

7,查看slave 狀態
    mysql -e ‘show slave status\G‘
        Slave_IO_State: 
              Master_Host: 172.22.7.77
              Master_User: wang
              Master_Port: 3306
            Connect_Retry: 10
          Master_Log_File: log-bin.001
      Read_Master_Log_Pos: 4
           Relay_Log_File: ct7m1-relay-bin.000001
            Relay_Log_Pos: 4
    Relay_Master_Log_File: log-bin.001
         Slave_IO_Running: No
        Slave_SQL_Running: No

                            ·········略
8,啟動復制線程
    mysql -e ‘start slave‘

9,再次查看slave狀態
    mysql -e ‘show slave status\G‘
        Slave_IO_State: 
              Master_Host: 172.22.7.77
              Master_User: wang
              Master_Port: 3306
            Connect_Retry: 10
          Master_Log_File: log-bin.001
      Read_Master_Log_Pos: 4
           Relay_Log_File: ct7m1-relay-bin.000001
            Relay_Log_Pos: 4
    Relay_Master_Log_File: log-bin.001
         Slave_IO_Running: Connecting
        Slave_SQL_Running: Yes

                            ·········略

10,master服務增刪改數據

11,查看slave服務是否同步,失敗!

#解決錯誤
12,停止並重置slave復制線程服務
    mysql -e ‘stop slave‘
    mysql -e ‘reset slave‘

13,配置正確的change master to 信息
    CHANGE MASTER TO MASTER_HOST=‘172.22.7.70‘,
    MASTER_USER=‘repluser‘,
    MASTER_PASSWORD=‘centos‘,
    MASTER_PORT=3306,
    MASTER_LOG_FILE=‘mysql-bin.000002‘,
    MASTER_LOG_POS=245;

14,查看slave狀態
     show slave status\G;
           Slave_IO_State: Waiting for master to send event
              Master_Host: 172.22.7.70
              Master_User: repluser
              Master_Port: 3306
            Connect_Retry: 10
          Master_Log_File: mysql-bin.000002
      Read_Master_Log_Pos: 7382
           Relay_Log_File: ct7m1-relay-bin.000002
            Relay_Log_Pos: 540
    Relay_Master_Log_File: mysql-bin.000002
         Slave_IO_Running: Yes
        Slave_SQL_Running: No

15,發現slave狀態中Slave_SQL_Running: No ,執行下面命令更為為YES
    MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.03 sec)

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
            Slave_IO_State: Waiting for master to send event
                Master_Host: 172.22.7.70
                Master_User: repluser
                Master_Port: 3306
                Connect_Retry: 10
            Master_Log_File: mysql-bin.000002
        Read_Master_Log_Pos: 7382
            Relay_Log_File: ct7m1-relay-bin.000003
                Relay_Log_Pos: 540
        Relay_Master_Log_File: mysql-bin.000002
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                                ·········略

16,查看slave服務數據是否同步

17,同步完成。

Mysql 級聯復制

在生產換進中有一種主從復制的方法主節點先將數據同步到一個中間的從節點,然後由從節點給後續的其他從節點來復制數據,這種復制方式稱為級聯復制。
級聯復制的好處是可以極大的減輕主節點的壓力 
級聯復制在配置時需要在中間節點上啟用log_slave_updates的選項。

#環境
    服務器  master          slave           slave
    系統    centos7         centos7         centos7
    ip      172.22.7.70     172.22.7.70     172.22.7.71

#mater 
1,主服務器啟用二進制日誌,並更改二進制目錄
    vim /etc/my.cnf
        log_bin=/data/bin/mysql-bin
        binlog-format=row
        server-id=1(主從服務器必需保證不同)
    更改目錄見上面

2,重啟服務
    service mysql restart

3,創建一個賬戶用來復制數據的賬戶
    mysql -e ‘GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"

4,查看主服務器正在使用的二進制日誌
    mysql -e ‘show master logs;‘
        +------------------+-----------+
        | Log_name         | File_size |
        +------------------+-----------+
        | mysql-bin.000001 |       264 |
        | mysql-bin.000002 |      7488 |
        | mysql-bin.000003 |       402 |
        +------------------+-----------+

#slave
5,修改配置文件,並創建二進制日誌目錄
     vim /etc/my.cnf
        [mysqld]
        log-bin=/data/bin/mysql-bin
        binlog-format=row
        read-only
        log_slave_updates
        server-id=2
    更改目錄見上

6,啟動服務
    systemctl restart mariadb

7,配置change master to信息
    CHANGE MASTER TO MASTER_HOST=‘172.22.7.70‘,MASTER_USER=‘repluser‘,MASTER_PASSWORD=‘centos‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘mysql-bin.000003‘, MASTER_LOG_POS=402;

8,啟動slave線程
    mysql -e ‘start slave‘

9,查看slave狀態
    show slave status\G;
    *************************** 1. row ***************************
           Slave_IO_State: Waiting for master to send event
              Master_Host: 172.22.7.70
              Master_User: repluser
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: mysql-bin.000003
      Read_Master_Log_Pos: 7539
           Relay_Log_File: ct7m1-relay-bin.000002
            Relay_Log_Pos: 7677
    Relay_Master_Log_File: mysql-bin.000003
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 

10,在master上增刪改數據測試查看

#slave1
11,在slave上將slave上的數據拷貝過來
    mysqldump -A --single-transaction -F --master-data=1 > /data/all.sql
    scp /data/all.sql 172.22.7.72:/data

12,slave創建一個賬戶用來復制數據的賬戶
    mysql -e ‘GRANT REPLICATION SLAVE ON *.* TO "repluser"@"172.22.7.%" IDENTIFIED BY "centos"

13,修改slave1配置
    vim /etc/my.cnf
        [mysqld]
        read-only
        server-id=3

14,啟動服務
    systemctl start mariadb 

15,查看slave服務器的二進制日誌
    mysql -e ‘show master logs‘
        +------------------+-----------+
        | Log_name         | File_size |
        +------------------+-----------+
        | mysql-bin.000001 |       351 |
        | mysql-bin.000002 |       351 |
        | mysql-bin.000003 |       351 |
        | mysql-bin.000004 |     25552 |
        | mysql-bin.000005 |       586 |
        +------------------+-----------+

16,打開all.sql文件對change master on信息加以修改
    CHANGE MASTER TO MASTER_HOST=‘172.22.7.71‘,MASTER_USER=‘repluser‘,MASTER     _PASSWORD=‘centos‘,MASTER_PORT=3306,MASTER_LOG_FILE=‘mysql-bin.000005‘,      MASTER_LOG_POS=586;       

17,導入slave數據
        mysql < /data/all.sql

18,啟動線程
    mysql -e "START SLAVE;"

19,查看slave狀態
     mysql -e "show slave status\G;"

20,對master對象增刪改操作,查看是否同步

21,同步完成。

MySQL半同步

異步復制是當用戶寫入一條記錄時,先將數據寫入到主節點,然後回復用戶一個寫入成功的消息,然後慢慢的將數據復制到其背後的其他從節點,這樣的好處是效率比較高,但是缺點也是非常明顯,主服務器和從服務器的延遲過大並且主服務器突然發生異常,此時就會造成數據的丟失。 

同步復制是當用戶寫入一條記錄時,主節點將數據寫入數據庫,然後將數據復制給其後面的其他從節點,當所有的從節點返回數據復制成功後,主節點再回復用戶數據接入成功的消息,這樣做的好處是,確保了數據的安全性,但損失了效率。 

半同步復制是間於同步復制和異步復制之間的一種復制方法,他的工作原理是:當用戶執行寫操作時,主節點會將數據發送給其後面的其他從節點,只要有一個從節點返回復制成功的消息,主節點就直接返回寫入成功,如果主節點背後的從節點遲遲不返回復制成功消息,此時就會有一個超時時長,一旦達到超時時長,主節點就先返回消息告訴用戶復制成功,而後將數據繼續給從節點復制。

#配置主從復制   步驟見上。

#配置半同步

##master
1,修改配置文件啟用插件
    vim /etc/my.cnf
        [mysqld]
        log-bin=/data/bin/mariadb-bin
        binlog-format=row
        server-id=1
        rpl_semi_sync_master_enabled     

2,重啟服務,
    systemctl restart mariadb

3,查看插件是否啟動 
    SHOW GLOBAL VARIABLES LIKE ‘%semi%‘;
        +------------------------------------+-------+
        | Variable_name                      | Value |
        +------------------------------------+-------+
        | rpl_semi_sync_master_enabled       | ON    |
        | rpl_semi_sync_master_timeout       | 3000  |
        | rpl_semi_sync_master_trace_level   | 32    |
        | rpl_semi_sync_master_wait_no_slave | ON    |
        +------------------------------------+-------+
        4 rows in set (0.00 sec)

4,設置超時時長
    SET GLOBAL rpl_semi_sync_master_timeout=3000;
    Query OK, 0 rows affected (0.00 sec)

##slave
5,修改配置文件啟用插件
    vim /etc/my.cnf
        [mysqld]
        log-bin=/data/bin/mariadb-bin
        binlog-format=row
        server-id=2
        rpl_semi_sync_master_enabled 

6,重啟服務,
    systemctl restart mariadb

7,查看插件是否啟動 
    SHOW GLOBAL VARIABLES LIKE ‘%semi%‘;
        +------------------------------------+--------------+
        | Variable_name                      | Value        |
        +------------------------------------+--------------+
        | rpl_semi_sync_master_enabled       | ON           |
        | rpl_semi_sync_master_timeout       | 1000         |
        | rpl_semi_sync_master_trace_level   | 32           |
        | rpl_semi_sync_master_wait_no_slave | ON           |
        | rpl_semi_sync_master_wait_point    | AFTER_COMMIT |
        +------------------------------------+--------------+
        5 rows in set (0.00 sec)

8,啟動復制線程
    mysql -e "START SLAVE";

9,測試檢查

10,同步完成

共勉!

MYSQL 完全備份、主從復制、級聯復制、半同步