1. 程式人生 > >mysql 主從復制

mysql 主從復制

mysql主從復制

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

### mysql 主從復制 ###

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


1、MySQL 主從復制基本工作原理 :
主服務器將改變記錄記錄到她的二進制日誌中,從服務器將主服務器的二進制日誌復制到它的中級日誌中去,然後通過中級日誌改變它的數據,這樣就實現了主從復制。
2、Slave 的兩個線程:
I/O 線程:將主服務器的二進制日誌寫入到中繼日誌中去
sql 線程:讀取中繼日誌的內容,更新數據。


一、環境準備
主服務器:redhat6.5 IP:172.25.24.1 安裝 mysql server1
從服務器:redhat6.5 IP:172.25.24.2 安裝 mysql server2


二、配置:

1、主從服務器分別作以下操作:
1.1、版本一致

tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar

yum install -y mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm

/etc/init.d/mysqld start

1.2、初始化表,並在後臺啟動 mysql

grep password /var/log/mysqld.log ##找出mysql初始密碼

mysql -p
1.3、修改 root 的密碼

mysql> ALTER USER [email protected] identified by ‘Westos+007‘;
2、修改主服務器 master:
vim /etc/my.cnf

在[mysqld]下添加一下參數
log-bin=mysql-bin #啟動二進制日誌系統
binlog-do-db=test #二進制需要同步的數據庫名,如果需要同步多個庫,例如要再同步 westos

庫,再添加一行“binlog-do-db=westos”,以此類推
server-id=1 #必須為 1 到 232–1 之間的一個正整數值
binlog-ignore-db=mysql #禁止同步 mysql 數據庫

/etc/init.d/mysqld restart #重啟mysql

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]%‘ IDENTIFIED BY ‘Westos+007‘; #創建同步帳戶,並給予權限

mysql> Flush privileges; #刷新

測試:

server2:

mysql -u panghu -p -h 172.25.24.1 ##登陸mysql

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+

server1:

mysql> show master status; ##查詢 master 的狀態

+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 601 | test | mysql | |

註:執行完此步驟後不要再操作主服務器 MYSQL,防止主服務器狀態值變化

3、修改從服務器 slave:
vim /etc/my.cnf

[mysqld]
log-bin=mysql-bin ##[不是必須]啟用二進制日誌
server-id=2 ##[必須]服務器唯一 ID,默認是 1,一般取IP 最後一段,從服務器 ID 號,不要和主 ID 相同,如果設置多個從服務器,每個從服務器必須有一個唯一的 server-id 值,必須與主服務器的以及其它從服務器的不相同。可以認為 server-id 值類似於 IP 地址:這些 ID 值能唯一識別復制服務器群集中的每個服務器實例。

4、在主服務器上查看master_log_pos值:

cd /var/lib/mysql/

mysqlbinlog mysql-bin.000001

5、配置從服務器 Slave:
mysql> change master to master_host=‘172.25.24.1‘, master_user=‘panghu‘, master_password=‘Westos+007‘, master_log_file=‘mysql-bin.000001‘, master_log_pos=514; ##註意不要斷開,514數字前後無單引號。
mysql> start slave; ##啟動從服務器復制功能
6、檢查從服務器復制功能狀態:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.24.1 ##主服務器地址
Master_User: panghu ##授權帳戶名,盡量避免使用
Master_Port: 3306 ##數據庫端口,部分版本沒有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 601 ##同步讀取二進制日誌的位置,大於等於 Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000002
Relay_Log_Pos: 407
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes ##此狀態必須 YES

Slave_SQL_Running: Yes ##此狀態必須 YES

......
註:Slave_IO 及 Slave_SQL 進程必須正常運行,即 YES 狀態,否則都是錯誤的狀態(如:其中一個 NO 均屬錯誤)。
以上操作過程,主從服務器配置完成。
7、主從服務器測試:server1


主服務器 Mysql,建立數據庫,並在這個庫中建表插入一條數據:

mysql> create database test;
mysql> use test;
mysql> create table usertb (
-> username varchar(15) not null,
-> password varchar(25) not null);
mysql> desc usertb;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(15) | NO | | NULL | |
| password | varchar(25) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
mysql> insert into usertb values (‘user1‘,‘111‘);
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 111 |
+----------+----------+


從服務器 Mysql 查詢:server2


mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+

mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| usertb |
+----------------+

mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 111 |
+----------+----------+

mysql 主從復制