1、介紹及準備工做java
1.介紹mysql
MySQL主從配置又叫Replication或者AB複製,簡單講就是A和B兩臺機器作主從後,在A上寫數據,另外一臺B也會跟着寫數據,兩臺數據實時同步。linux
MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。web
主從過程大體有3個步驟sql
主將更改操做記錄到Binlog裏數據庫
從將主的Binlog事件(sql語句)同步到從本機上並記錄在relaylog裏服務器
從根據relaylog裏面的sql語句按順序執行ide
主上有一個logdump線程,用來和從的i/o線程傳遞binlog測試
從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句執行一遍。spa
適用場景:
(1)作數據庫數據備份,僅僅是備份,當主機宕機時,立刻從機能夠代替主機。
(2)仍是作數據備份,可是和主機同樣,會向web服務器提供服務。可是不能往從機上寫數據。
主從延遲:「步驟2」開始,到「步驟7」執行結束。
步驟 2:存儲引擎處理,時間極短
步驟 3:文件更新通知,磁盤讀取延遲
步驟 4:Bin Log 文件更新的傳輸延遲,單線程
步驟 5:磁盤寫入延遲
步驟 6:文件更新通知,磁盤讀取延遲
步驟 7:SQL 執行時長
Master
上 1 個IO線程
,負責向Slave傳輸 binary log
(binlog
)
Slave
上 2 個線程:IO 線程
和執行SQL的線程
,其中:
IO線程
:將獲取的日誌信息,追加到relay log上;
執行SQL的線程
:檢測到relay log中內容有更新,則在Slave上執行sql;
2.準備工做
準備兩臺機器,上面都要安裝MySQL。
MySQL的安裝這裏就不說了,前面日誌會有。
這裏常常會出現一個權限問題。由於/data/mysql下的文件全部者和所屬組都變成了root。用chmod改爲MySQL便可。
2、配置MySQL的主機
1.安裝MySQL
2.修改/etc/my.cnf文件,添加如下2段
server-id=100
log_bin=litongyao1 (生成binlog,litongyao1是他的文件開頭)
從新啓動mysql
[root@zhuji ~]# /etc/init.d/mysqld restart
接下來咱們查看/data/mysql下,
[root@zhuji ~]# ll /data/mysql/
總用量 110700
-rw-rw----. 1 mysql mysql 56 11月 30 14:48 auto.cnf
-rwxr-xr-x. 1 mysql mysql 12582912 12月 29 13:59 ibdata1
-rwxr-xr-x. 1 mysql mysql 50331648 12月 29 13:59 ib_logfile0
-rwxr-xr-x. 1 mysql mysql 50331648 11月 30 14:15 ib_logfile1
drwx------. 2 mysql mysql 62 12月 28 21:01 java_test
-rw-rw----. 1 mysql mysql 120 12月 29 13:59 litongyao1.000001
-rw-rw----. 1 mysql mysql 143 12月 29 13:59 litongyao1.000002
-rw-rw----. 1 mysql mysql 120 12月 29 13:59 litongyao1.000003
-rw-rw----. 1 mysql mysql 60 12月 29 13:59 litongyao1.index
drwxr-xr-x. 2 mysql mysql 4096 12月 19 17:05 mysql
drwxr-xr-x. 2 mysql mysql 4096 11月 30 14:15 performance_schema
drwx------. 2 mysql mysql 50 12月 19 17:50 rxr
drwxr-xr-x. 2 mysql mysql 6 11月 30 14:14 test
-rw-rw----. 1 mysql mysql 73149 12月 29 13:59 zhuji.err
-rw-rw----. 1 mysql mysql 5 12月 29 13:59 zhuji.pid
drwx------. 2 mysql mysql 4096 12月 28 20:17 zrlog
3.把mysql庫備份並恢復成litongyao庫,做爲測試數據
[root@zhuji ~]# mysqldump -uroot -paminglinux rxr > /tmp/rxr.sql
[root@zhuji ~]# ll /tmp/rxr.sql
-rw-r--r--. 1 root root 1780 12月 29 14:27 /tmp/rxr.sql
[root@zhuji ~]# mysql -uroot -paminglinux -e "create database litongyao"
[root@zhuji ~]# mysql -uroot -paminglinux litongyao < /tmp/rxr.sql
4.建立MySQL用戶用做同步數據
mysql> grant replication slave on *.* to 'repl'@'192.168.52.100' identified by 'rxr123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; (這裏要記住binlog的名字file,還有它的位置Position)
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| litongyao1.000003 | 1029 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
[root@zhuji ~]# mysqldump -uroot -paminglinux zrlog > /tmp/zrlog.sql
Warning: Using a password on the command line interface can be insecure.
3、配置從機
安裝MySQL
查看my.cnf,配置server-id,要求和主不同。
server-id=101
3.從新啓動MySQL服務
[root@congji ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL.. SUCCESS!
4.把主上的litongyao庫同步到從上
(1)把備份的庫文件用scp到從機上
[root@congji ~]# scp 192.168.52.101:/tmp/*.sql /tmp/
root@192.168.52.101's password:
rxr.sql 100% 1780 1.7KB/s 00:00
zrlog.sql 100% 9886 9.7KB/s 00:00
(2)建立相應的數據庫
mysql> create database rxr;
Query OK, 1 row affected (0.00 sec)
mysql> create database zrlog;
Query OK, 1 row affected (0.00 sec)
(3)把備份的庫恢復到從機上,保證主從2邊數據庫一致
[root@congji bin]# mysql -uroot zrlog < /tmp/zrlog.sql
[root@congji bin]# mysql -uroot rxr < /tmp/rxr.sql
(4)中止主從同步
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
(5)接下來就是最重要的一步操做,在從機上配置主機的ip,用戶名,密碼,binlog的name以及pos。
mysql> change master to master_host='192.168.52.101', master_user='repl', master_password='rxr123456', master_log_file='litongyao1.000003', master_log_pos=1029;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
(6)開啓主從同步
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
(7)查看主從有沒有配置成功 (查看是否有兩個yes)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.52.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: litongyao1.000003
Read_Master_Log_Pos: 1029
Relay_Log_File: congji-relay-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: litongyao1.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
(8)解鎖主機上的表,讓它恢復寫的操做
(主機:192.168.52.101)
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
4、測試主從同步
幾個配置參數:在/etc/my.cnf裏
主服務器上:
binlog-do-db= //僅同步指定的庫
binlog-ignore-db= //忽略指定庫
從服務器上:
(推薦應用等級:中)
replicate_do_db= //僅同步指定的庫
replicate_ignore_db= //忽略指定庫
(推薦應用等級:低)萬一不通的庫裏有同名的表
replicate_do_table= //僅同步指定的表
replicate_ignore_table= //忽略指定表
(推薦應用等級:高)
replicate_wild_do_table= //如aming.%, 支持通配符% //僅同步指定庫裏的指定表
replicate_wild_ignore_table= //不一樣步指定庫裏的指定表
測試主從:
主機:
mysql> use rxr;
Database changed
mysql> show tables;
Empty set (0.00 sec)
從機:
mysql> use rxr;
Database changed
mysql> show tables;
Empty set (0.00 sec)
增長一個表:
主機:
mysql> create table lty(`id`int(4),`name`char(40));
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
+---------------+
| Tables_in_rxr |
+---------------+
| lty |
+---------------+
1 row in set (0.00 sec)
從機:
cremysql> show tables;
+---------------+
| Tables_in_rxr |
+---------------+
| lty |
+---------------+
1 row in set (0.00 sec)
增長表實現主從同步。
刪除表:
主機:
mysql> drop table lty;
Query OK, 0 rows affected (0.26 sec)
mysql> show tables;
Empty set (0.00 sec)
從機:
mysql> show tables;
Empty set (0.00 sec)
刪除表也實現了主從同步。
3、若是誤操做,致使主從同步異常,怎麼辦?
最重要的一步就是立刻關閉主從同步:
stop slave;
接着立刻作一步操做:
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
接着打開主從同步:
start slave;
而後查看是否恢復正常。