本文講述了MySQL單主、雙主模式的配置方法、注意事項、和維護的一些事項。node
編輯/etc/my.cnf,在mysqld配置段中添加如下內容(需重啓服務)mysql
server-id=1 log_bin=/data/mysql/logs/mysql-bin
啓動數據庫並作受權:sql
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'node2'@'192.168.200.%' IDENTIFIED BY 'node2pass'; MariaDB [(none)]> FLUSH PRIVILEGES;
編輯/etc/my.cnf,在mysqld配置段中添加如下內容(需重啓服務)數據庫
server-id=2 relay-log=/data/mysql/logs/relay-bin
啓動服務後設置主節點並啓動服務器
MariaDB [(none)]> change master to master_host='192.168.200.41',master_port=3306,master_user='node2',master_password='node2pass',master_log_file='mysql-bin.000003', master_log_pos =4; MariaDB [(none)]> START SLAVE; MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.200.41 Master_User: node2 Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 927 Relay_Log_File: relay-bin.000003 Relay_Log_Pos: 604 Relay_Master_Log_File: mysql-bin.000003 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: 927 Relay_Log_Space: 1783 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_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
查看show slave status時,Slave_IO_Running和Slave_SQL_Running狀態爲yes時即成功。可在主節點建立庫或者表查看從節點是否也有。ide
180603 16:46:49 [Note] Slave I/O thread: connected to master 'node2@192.168.200.41:3306',replication started in log 'mysql-bin.000003' at position 760 180603 16:46:49 [ERROR] Error reading packet from server: binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin.000003' at 760, the last event read from 'mysql-bin.000003' at 760, the last byte read from 'mysql-bin.000003' at 769. ( server_errno=1236) 180603 16:46:49 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin.000003' at 760, the last event read from 'mysql-bin.000003' at 760, the last byte read from 'mysql-bin.000003' at 769.', Error_code: 1236
解決方法:
經過show binary logs查看當前的二進制文件有哪些,再經過show binlog events in 'BINLOG FILE NAME',找到正確的POS位置,並在change master時使用正確的POS位置。測試
MariaDB [(none)]> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 30355 | | mysql-bin.000002 | 1038814 | | mysql-bin.000003 | 491 | +------------------+-----------+ 3 rows in set (0.00 sec)
MariaDB [(none)]> show binlog events in 'mysql-bin.000003'; +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | mysql-bin.000003 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 | | mysql-bin.000003 | 245 | Query | 1 | 416 | grant replication slave,replication client on *.* to lxk@'192.168.200.%' identified by 'lxkpass' | | mysql-bin.000003 | 416 | Query | 1 | 491 | flush privileges | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)
如上代碼:選擇Pos(開始位置)或者End_log_pos(結束位置)均可以。spa
節點1:編輯/etc/my.cnf,在mysqld配置段添加如下內容保存退出:命令行
log_bin=/data/mysql/logs/mysql-bin relay_log=/data/mysql/logs/relay-log
注:要確保mysql對/data/mysql/logs目錄有讀寫權限
節點2:編輯/etc/my.cnf,在mysqld配置段添加如下內容保存退出:線程
log_bin=/data/mysql/logs/mysql-bin relay_log=/data/mysql/logs/relay-log
注:要確保mysql對/data/mysql/logs目錄有讀寫權限
節點1 IP:192.168.200.41 節點2 IP:192.168.200.42
節點1與節點2都進行一樣的操做以受權一個用戶:
MariaDB [(none)]> grant replication slave,replication client on *.* to lxk@'192.168.200.%' identified by 'lxkpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec)
查看要複製的Pos位置:
節點1:
MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 491 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> show binlog events in 'mysql-bin.000003'; +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | mysql-bin.000003 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 | | mysql-bin.000003 | 245 | Query | 1 | 416 | grant replication slave,replication client on *.* to lxk@'192.168.200.%' identified by 'lxkpass' | | mysql-bin.000003 | 416 | Query | 1 | 491 | flush privileges | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)
節點2:
MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 491 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> show binlog events in 'mysql-bin.000003'; +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ | mysql-bin.000003 | 4 | Format_desc | 2 | 245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 | | mysql-bin.000003 | 245 | Query | 2 | 416 | grant replication slave,replication client on *.* to lxk@'192.168.200.%' identified by 'lxkpass' | | mysql-bin.000003 | 416 | Query | 2 | 491 | flush privileges | +------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------------------------------+ 3 rows in set (0.00 sec)
由於爲新數據庫,兩個節點的pos值相同,都爲491,生產環境根據須要調整,通常位置的選取都是從受權後的位置開始。
執行同步語句:
節點1:
MariaDB [(none)]> change master to master_host='192.168.200.42',master_user='lxk',master_password='lxkpass',master_log_file='mysql-bin.000003',master_log_pos=491; Query OK, 0 rows affected (0.27 sec) MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
節點2:
MariaDB [(none)]> change master to master_host='192.168.200.41',master_user='lxk',master_password='lxkpass',master_log_file='mysql-bin.000003',master_log_pos=491; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.200.41 #主節點地址 Master_User: lxk #主節點用戶名 Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 491 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes #IO線程開啓 Slave_SQL_Running: Yes #SQL線程開啓
只要執行結果中slave_IO_Runing和Slave_SQL_Runing狀態爲Yes,即表示從節點鏈接主節點成功併成功開啓複製功能。
MariaDB [(none)]> create database testdb; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | testdb | +--------------------+ 5 rows in set (0.00 sec)
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | testdb | +--------------------+ 5 rows in set (0.00 sec)
MariaDB [testdb]> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 30355 | | mysql-bin.000002 | 1038814 | | mysql-bin.000003 | 1364 | +------------------+-----------+ 3 rows in set (0.00 sec) MariaDB [testdb]> purge binary logs to 'mysql-bin.000003'; #清空至mysql-bin.000003的日誌 Query OK, 0 rows affected (0.01 sec) MariaDB [testdb]> show binary logs; #再次查看日誌 +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000003 | 1364 | +------------------+-----------+ 1 row in set (0.00 sec) [root@node1 ~]# ls /data/mysql/logs/ #查看二進制日誌保存目錄,000003以前的都已經刪除 mysql-bin.000003 mysql-bin.index relay-log.000001 relay-log.000002 relay-log.index
複製監控
如何肯定主從節點數據是否一致