實驗環境,假設公司想要對一臺運行了一段時間的mysql服務器,作一個主主複製架構,以提高數據庫的讀寫能力。mysql
老服務器用M0表示
新服務器用M1表示sql
mysqldump -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob > /mysqlbackup/all.sql 命令解析: -A:備份全部數據庫,含create database語句 -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會致使刷新屢次數據庫,在同一時刻執行轉儲和日誌刷新,--single-transaction 之刷新一次二進制日誌 --single-transaction :只刷新一次二進制日誌 --flush-privileges: 備份mysql或相關時須要使用 --triggers:備份表相關的觸發器,默認啓用,用--skiptriggers,不備份觸發器 --master-data=【1|2】:注意:此選項須啓用二進制日誌 1:所備份的數據以前加一條記錄爲CHANGE MASTER TO語 句,非註釋,不指定#,默認爲1 2:記錄爲註釋的CHANGE MASTER TO語句 此選項會自動關閉--lock-tables功能,自動打開--lock-alltables功能(除非開啓--single-transaction)
[root@centos7 ~]# grep -i ^change* /mysqlbackup/all.sql CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000005', MASTER_LOG_POS=245; 當前備份位置是mariadb-bin.000002的245,以前的全部內容都備份了
scp /mysqlbackup/all.sql 192.168.68.17:/data/
vim /etc/my.cnf 在[mysqld]配置塊中添加以下配置 [mysqld] server_id=0 #設置爲當前節點設置一個全局唯一的ID號 innodb_file_per_table #啓用數據庫儀表結構分離存放在兩個不一樣文件 auto_increment_offset=1 #設置字段自動增加的起始值1 auto_increment_increment=2 #增加的幅度爲2 log_bin #啓用二進制日誌
systemctl restart mairadb
M0 [(none)]>GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass'; 命令解析: 'repluser'@'HOST' :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.% IDENTIFIED BY:設置密碼 *.* :表示全部數據庫,全部表 GRANT REPLCATION SLAVE:就是容許該用戶複製數據 該命令做用就是受權repluser能拷貝數據庫的全部內容
yum install mairadb-server
vim /etc/my.cnf 在[mysqld]配置塊中添加以下配置 [mysqld] server_id=0 #設置爲當前節點設置一個全局唯一的ID號 innodb_file_per_table #啓用數據庫儀表結構分離存放在兩個不一樣文件 auto_increment_offset=2 #設置字段自動增加的起始值2 auto_increment_increment=2 #增加的幅度爲2 log_bin #啓用二進制日誌
systemctl restart mariadb
"mysql_secure_installation" 第一項問你:輸入root密碼 回車便可,由於沒有 第二項問你:須要設置root密碼麼, 第三項問你:須要刪除空帳號用戶麼, 第四項問你:禁止root用戶遠程登入麼, 第五項問你:須要刪除test測試數據庫麼, 第六項問你:如今從新加載權限表嗎 ,
登入mysql終端執行下面的命令 M1 [(none)]>source /data/all.sql
M1 [(none)]>GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass'; 命令解析: 'repluser'@'HOST' :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.% IDENTIFIED BY:設置密碼 *.* :表示全部數據庫,全部表 GRANT REPLCATION SLAVE:就是容許該用戶複製數據 該命令做用就是受權repluser能拷貝數據庫的全部內容
1,使用有複製權限的用戶帳號鏈接至主服務器數據庫
M1 [(none)]> CHANGE MASTER TO MASTER_HOST='host', #指定M0主機IP MASTER_USER='repluser', #指定M0被受權的用戶名 MASTER_PASSWORD='replpass',#指定M0被受權的用戶密碼 MASTER_LOG_FILE='mysql-bin.xxxxx', #指定從M0服務器的那個二進制日誌開始複製 MASTER_LOG_POS=#; #二進制日誌位置,能夠在M1服務器上執行該命令查看,show master logs;
2,啓動複製線程IO_THREAD和SQL_THREADvim
M1 [(none)]>START SLAVE;
3,查看線程狀態centos
M1 [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.68.7 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000005 Read_Master_Log_Pos: 245 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 843 Relay_Master_Log_File: mariadb-bin.000005 Slave_IO_Running: Yes "重點關注若是是NO表示線程沒起來" Slave_SQL_Running: Yes "重點關注 若是是NO表示該線程沒起來" 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: 557 Relay_Log_Space: 1139 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 "該項表示同步時間 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,使用有複製權限的用戶帳號鏈接至主服務器安全
M0 [(none)]> CHANGE MASTER TO MASTER_HOST='host', #指定M1主機IP MASTER_USER='repluser', #指定M1被受權的用戶名 MASTER_PASSWORD='replpass',#指定M1被受權的用戶密碼 MASTER_LOG_FILE='mysql-bin.xxxxx', #指定從M1服務器的那個二進制日誌開始複製 MASTER_LOG_POS=#; #二進制日誌位置,能夠在M0服務器上執行該命令查看,show master logs;
2,啓動複製線程IO_THREAD和SQL_THREAD服務器
M0 [(none)]> START SLAVE;
3,查看線程狀態架構
M0 [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.68.17 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mariadb-bin.000001 Read_Master_Log_Pos: 55732 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 843 Relay_Master_Log_File: mariadb-bin.000001 Slave_IO_Running: Yes "重點關注若是是NO表示線程沒起來" Slave_SQL_Running: Yes "重點關注 若是是NO表示該線程沒起來" 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: 557 Relay_Log_Space: 1139 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 "該項表示同步時間 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,在M0上建立一張測試表ide
create table t1(id int unsigned primary key auto_increment,name varchar(30)); 該命令就是在test數據庫中建立一張名爲t1,有兩個字段,一個字段是id,另外一個是name,其中id是整數,並且是主鍵,而且仍是自動增加,name字段是任意字符,字符長度只有30個
2,查看M1是否同步測試
M1 [test]> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | +----------------+
3,在M1,test數據庫的t1表中插入兩條記錄
MariaDB [test]> insert t1(name) values('wang'); Query OK, 1 row affected (0.01 sec) MariaDB [test]> insert t1(name) values('li'); Query OK, 1 row affected (0.02 sec) MariaDB [test]> select * from t1 -> ; +----+------+ | id | name | +----+------+ | 2 | wang | | 4 | li | +----+------+ 2 rows in set (0.00 sec) "注意: 爲何id是2,4呢,這就是在M1的配置文件中的這兩行的做用 auto_increment_offset=2 #設置字段自動增加的起始值2 auto_increment_increment=2 #增加的幅度爲2" 而M0上在這張表上插入的內容就是以基數增加了,可是它不會不全前面缺的數,而是一直增張。 M0 [test]> select * from t1; +----+-------+ | id | name | +----+-------+ | 2 | wang | | 4 | li | | 5 | zhang | | 7 | huang | +----+-------+ 4 rows in set (0.00 sec)