廢話不多少, 直接上乾貨!
mysql主從複製概述:
複製解決的基本問題是讓一台伺服器的資料和另外的伺服器保持同步。
一台主要伺服器可以連接多台從伺服器, 並且從伺服器也可以反過來作主要伺服器。
主要伺服器和從伺服器可以位於不同的網路拓撲中, 還能對整台伺服器、特定的資料庫, 甚至特定的表進行複製。
主從伺服器的版本必須一致。
主要伺服器版本可以低一些的, 從伺服器版本要高一些。
1.2 . 複製解決的問題
MySQL複製技術有以下一些特點:
(1) 資料分佈 (Data distribution )
(2) 負載平衡(load balancing)
(3) 備份(Backups)
(4) 高可用性和容錯移轉 High availability and failover
1.3 複製如何工作
、
整體上來說, 複製有3個步驟:
(1) master將改變記錄到二進位日誌(binary log)中(這些記錄叫做二進位日誌事件, binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重做中繼日誌中的事件, 修改salve上的資料。
mysql主從複製中:
第一步:master記錄二進位日誌。 在每個事務更新資料完成之前, master在二日誌記錄這些改變。
第二步:slave將master的binary log拷貝到它自己的中繼日誌。 首先, slave開始一個工作執行緒——I/O執行緒。 I/O執行緒在master上打開一個普通的連接, 然後開始binlog dump process。 Binlog dump process從master的二進位日誌中讀取事件, 如果已經執行完master產生的所有檔, 它會睡眠並等待master產生新的事件。 I/O執行緒將這些事件寫入中繼日誌。
第三步:SQL slave thread(SQL執行緒)處理該過程的最後一步。 SQL執行緒從中繼日誌讀取事件, 並重新執行其中的事件而更新slave的資料, 使其與master中的資料一致。
模式: C/S 模式
埠:3306
實戰:實戰mysql主從配備
xuegod63 主mysql伺服器配置
安裝資料庫:
[root@xuegod63 ~]# yum install mysql-server -y
[root@xuegod63 ~]# service mysqld start
創建要同步的資料庫:
[root@xuegod63 ~]# mysql -h 127.0.0.1 -u root -p #連接資料庫
或:
[root@xuegod63 ~]# mysql
mysql> create databasecd;
mysql> use cd;
mysql> create table test1 (id int); 欄位名 資料類型
mysql> show tables;
停止mysql主服務
[root@xuegod63 ~]# service mysqld stop
配置mysql主要同步的資料庫名字並開啟對應的二進位日誌
#vim /etc/my.cnf # my.cnf 是mysql 主設定檔
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 #在原設定檔中,添加以下內容:
log-bin=mysqllog
server-id=1
binlog-do-db=cd
注釋:
log-bin=mysqllog #啟用二進位日誌,預設存在/var/lib/mysql 下面
server-id=1 #本機資料庫ID 唯一標示。
binlog-do-db=cd #可以被從伺服器複製的庫。二進位需要同步的資料庫名
# binlog-ignore-db=mk2 不可以被從伺服器複製的庫
重新啟動
[root@xuegod63 ~]# service mysqld restart
授權
mysql> grant replication slave on *.* to slave@192.168.10.64 identified by "123456";
在從xuegod64上測試登錄:
[root@xuegod64 ~]# mysql -h 192.168.10.63 -u slave -p123456
複製前保證主從兩個資料庫資料一致:
把主的原始數據傳給從:
例:匯出所有資料庫:
[root@xuegod63 ~]# mysqldump -u root -p -A > all1.sql
參數:-A, --all-databases Dump all the databases.
資料庫複製到xuegod64上:
方法1:scp all1.sql 192.168.10.64:/root
[root@xuegod64 ~]# mysql -u root -p < all1.sql="">
Enter password:
[root@xuegod64 ~]# mysql
mysql> show databases;
mysql> usecd;
mysql> show tables;
修改從伺服器設定檔:
[root@xuegod64 ~]#vim/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#在設定檔中寫入以下內容
server-id=2 #從伺服器ID號,不要和主ID相同 ,如果設置多個從伺服器,每個從伺服器必須有一個唯一的server-id值,必須與主要伺服器的以及其它從伺服器的不相同。可以認為server-id值類似於IP位址:這些ID值能唯一識別複製伺服器叢集中的每個伺服器實例。
master-host=192.168.10.63 #指定主要伺服器IP位址
master-user=slave #指定在主要伺服器上可以進行同步的用戶名
master-password=123456 #密碼
####以下可以不寫
master-port = 3306 #同步所用的埠
master-connect-retry=60 #中斷點重新連線時間
保存,重啟
#service mysqld restart
測試:
主要伺服器上查看:
mysql> show master status;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: mk1
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mysqllog.000001 | 106 | mk1 | |
主要伺服器是正常狀態
從伺服器上查看:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.63
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqllog.000001
Read_Master_Log_Pos: 315
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 459
Relay_Master_Log_File: mysqllog.000001
Slave_IO_Running: Yes #可以看到這兩個Yes,說明從伺服器安裝成功。
Slave_SQL_Running: Yes
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
測試:資料同步
xuegod63寫資料:
mysql> use cd;
Database changed
mysql> show tables;
+--------------+
| Tables_in_cd |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mysql> insert into test1 values(1);
xuegod64讀數據:
mysql> use cd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test1;
+------+
| id |
+------+
| 1 |
+------+
排錯:
同步之前如果懷疑主從資料不同步可以採取:上面冷備份遠端拷貝法或者在從伺服器上命行同步方法。
mysql> show tables;
停止mysql主服務
[root@xuegod63 ~]# service mysqld stop
配置mysql主要同步的資料庫名字並開啟對應的二進位日誌
#vim /etc/my.cnf # my.cnf 是mysql 主設定檔
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 #在原設定檔中,添加以下內容:
log-bin=mysqllog
server-id=1
binlog-do-db=cd
注釋:
log-bin=mysqllog #啟用二進位日誌,預設存在/var/lib/mysql 下面
server-id=1 #本機資料庫ID 唯一標示。
binlog-do-db=cd #可以被從伺服器複製的庫。二進位需要同步的資料庫名
# binlog-ignore-db=mk2 不可以被從伺服器複製的庫
重新啟動
[root@xuegod63 ~]# service mysqld restart
授權
mysql> grant replication slave on *.* to slave@192.168.10.64 identified by "123456";
在從xuegod64上測試登錄:
[root@xuegod64 ~]# mysql -h 192.168.10.63 -u slave -p123456
複製前保證主從兩個資料庫資料一致:
把主的原始數據傳給從:
例:匯出所有資料庫:
[root@xuegod63 ~]# mysqldump -u root -p -A > all1.sql
參數:-A, --all-databases Dump all the databases.
資料庫複製到xuegod64上:
方法1:scp all1.sql 192.168.10.64:/root
[root@xuegod64 ~]# mysql -u root -p < all1.sql="">
Enter password:
[root@xuegod64 ~]# mysql
mysql> show databases;
mysql> usecd;
mysql> show tables;
修改從伺服器設定檔:
[root@xuegod64 ~]#vim/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#在設定檔中寫入以下內容
server-id=2 #從伺服器ID號,不要和主ID相同 ,如果設置多個從伺服器,每個從伺服器必須有一個唯一的server-id值,必須與主要伺服器的以及其它從伺服器的不相同。可以認為server-id值類似於IP位址:這些ID值能唯一識別複製伺服器叢集中的每個伺服器實例。
master-host=192.168.10.63 #指定主要伺服器IP位址
master-user=slave #指定在主要伺服器上可以進行同步的用戶名
master-password=123456 #密碼
####以下可以不寫
master-port = 3306 #同步所用的埠
master-connect-retry=60 #中斷點重新連線時間
保存,重啟
#service mysqld restart
測試:
主要伺服器上查看:
mysql> show master status;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: mk1
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mysqllog.000001 | 106 | mk1 | |
主要伺服器是正常狀態
從伺服器上查看:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.63
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqllog.000001
Read_Master_Log_Pos: 315
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 459
Relay_Master_Log_File: mysqllog.000001
Slave_IO_Running: Yes #可以看到這兩個Yes,說明從伺服器安裝成功。
Slave_SQL_Running: Yes
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
測試:資料同步
xuegod63寫資料:
mysql> use cd;
Database changed
mysql> show tables;
+--------------+
| Tables_in_cd |
+--------------+
| test1 |
+--------------+
1 row in set (0.00 sec)
mysql> insert into test1 values(1);
xuegod64讀數據:
mysql> use cd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test1;
+------+
| id |
+------+
| 1 |
+------+
排錯:
同步之前如果懷疑主從資料不同步可以採取:上面冷備份遠端拷貝法或者在從伺服器上命行同步方法。