• MySQL主從又叫作Replication、AB複製。簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步的mysql
• MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。linux
• 主從過程大體有3個步驟web
• 1)主將更改操做記錄到binlog裏sql
• 2)從將主的binlog事件(sql語句)同步到從本機上並記錄在relaylog裏數據庫
• 3)從根據relaylog裏面的sql語句按順序執行vim
• 主上有一個log dump線程,用來和從的I/O線程傳遞binlog服務器
• 從上有兩個線程,其中I/O線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的sql語句落地socket
MySQL主從的原理圖ide
其中Msater是主,Slave是從測試
MySQL主從的做用
注:mysql主從,是有方向性的,寫數據,必須從主機器開始;若是不依照原理會致使數據紊亂
準備兩臺機器,每臺機器安裝msyql服務,並啓動mysql服務
1.下載安裝包(二進制免編譯)-->2.解壓壓縮包-->3.初始化-->4.修改配置文件-->5.複製啓動腳本-->6.修改啓動腳本-->7.啓動mysql-->8.開機啓動mysql
首先下載二進制免編譯的包,下載到/usr/local/src/目錄下
解壓完以後,把解壓出來的目錄放到 /usr/local/mysql/ 目錄下
注:首先檢查 /usr/local/mysql/ 目錄是否存在,如果這個目錄存在,首先把這個目錄改個名字,或者把目錄下的內容刪除,而後把解壓出來的目錄放到 /usr/local/mysql/ 目錄下面
cd /usr/local/mysql/ ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
注:其中的--user=mysql 須要提早建立mysql用戶;初始化成功的標誌就是兩個OK,或者用 echo $? 檢查是否初始化成功
vim /etc/my.cnf 定義 datadir=/data/mysql 定義 socket=/tmp/mysql.sock
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
vim /etc/init.d/mysqld //對如下兩行進行指定路徑 指定basedir的路徑 /usr/local/mysql 指定datadir的路徑 /data/mysql
/etc/init.d/mysql start
若是啓動失敗,能夠去查看錯誤日誌;
查看 /data/mysql 目錄下的文件,默認屬主、屬組,若是不是mysql的,啓動時會因沒法寫入數據而不能啓動mysql,須要改變屬主和屬組
chomd mysql:mysql /data/mysql
chkconfig mysqld on
vim /etc/my.cnf 增長server-id=5和log_bin=lemlinux1
[root@linux-5 ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL. SUCCESS!
[root@linux-5 ~]# cd /data/mysql/ [root@linux-5 mysql]# ls -lt 總用量 110676 -rw-rw----. 1 mysql mysql 50331648 7月 5 23:59 ib_logfile0 -rw-rw----. 1 mysql mysql 12582912 7月 5 23:59 ibdata1 -rw-rw----. 1 mysql mysql 54024 7月 5 23:59 linux-5.err -rw-rw----. 1 mysql mysql 5 7月 5 23:59 linux-5.pid -rw-rw----. 1 mysql mysql 19 7月 5 23:59 lemlinux1.index -rw-rw----. 1 mysql mysql 120 7月 5 23:59 lemlinux1.000001 drwx------. 2 mysql mysql 4096 7月 4 23:34 zrlog -rw-rw----. 1 mysql mysql 56 5月 24 19:58 auto.cnf drwx------. 2 mysql mysql 4096 5月 24 18:35 mysql drwx------. 2 mysql mysql 4096 5月 24 18:35 performance_schema -rw-rw----. 1 mysql mysql 50331648 5月 24 18:35 ib_logfile1 drwx------. 2 mysql mysql 6 5月 24 18:35 test
其中.index;.000001這些文件是實現MySQL主從的根本
.index 索引頁,這個文件是必需要有的
.000001 這個是二進制日誌文件,會持續生成二、三、4等等(這個文件是實現主從配置的根本,沒有這個文件根本沒有辦法完成主從)
把zrlog庫備份並恢復成lem庫,做爲測試數據
mysqldump -uroot zrlog > /tmp/lem.sql //zrlog數據庫備份 mysql -uroot -e "create database lem" //建立新庫lem mysql -uroot lem < /tmp/lem.sql //將zrlog數據庫備份數據導入lem庫中
[root@linux-5 mysql]# ls -lt 總用量 110688 -rw-rw----. 1 mysql mysql 50331648 7月 6 00:09 ib_logfile0 -rw-rw----. 1 mysql mysql 12582912 7月 6 00:09 ibdata1 -rw-rw----. 1 mysql mysql 10152 7月 6 00:08 lemlinux1.000001 drwx------. 2 mysql mysql 4096 7月 6 00:08 lem -rw-rw----. 1 mysql mysql 54024 7月 5 23:59 linux-5.err -rw-rw----. 1 mysql mysql 5 7月 5 23:59 linux-5.pid -rw-rw----. 1 mysql mysql 19 7月 5 23:59 lemlinux1.index drwx------. 2 mysql mysql 4096 7月 4 23:34 zrlog -rw-rw----. 1 mysql mysql 56 5月 24 19:58 auto.cnf drwx------. 2 mysql mysql 4096 5月 24 18:35 mysql drwx------. 2 mysql mysql 4096 5月 24 18:35 performance_schema -rw-rw----. 1 mysql mysql 50331648 5月 24 18:35 ib_logfile1 drwx------. 2 mysql mysql 6 5月 24 18:35 test
能夠看到lemlinux1.000001二進制文件是有增長的,lemlinux1.000001增加的大小是和zrlog這個數據庫備份的大小保持一致的,lemlinux1.000001文件裏完整的記錄了數據庫的建立的庫,建立的表,以及表裏的內容,經過完整的lemlinux1.000001文件也能夠恢復數據庫的數據
在MySQL主從中,從數據庫須要到主數據庫上同步日誌,這個過程須要認證,所以咱們須要在主庫上建立一個用戶用於從庫登陸同步日誌。
grant replication slave on *.* to 'repl'@192.168.88.10(從庫IP) identified by '123456';
鎖定表,目的是不讓表繼續寫,由於一會須要作從機器配置,須要進行一個同步,讓兩臺機器同步,保證兩臺機器的數據一致,同步纔不會出錯
flush tables with read lock;
查看一下binlog的文件和大小,並記住binlog的filename
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | lemlinux1.000001 | 10362 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
查看/data/mysql/下有哪些庫,主上有哪些庫,從上也得有哪些庫,同步這些庫,就意味着這些數據都要備份過去
[root@linux-5 mysql]# ls /data/mysql/ auto.cnf ib_logfile0 lem lemlinux1.index linux-5.pid performance_schema zrlog ibdata1 ib_logfile1 lemlinux1.000001 linux-5.err mysql test
備份數據庫,除了mysql庫,由於mysql庫裏面有帳號密碼,從上備份的時候不可能把全部權限複製過去,因此mysql不須要備份
mysqldump -uroot test > /tmp/lem2.sql
在主從同步時把主上/tmp/目錄下 .sql文件都拷貝到從上去
vim /etc/server 增長server-id = 10
從庫不須要生成二進制日誌文件,只有主庫須要
[root@linux-10 ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL. SUCCESS!
[root@linux-10 ~]# scp 192.168.88.5:/tmp/*.sql /tmp/ Warning: Permanently added '192.168.88.5' (ECDSA) to the list of known hosts. root@192.168.88.5's password: lem2.sql 100% 1258 1.0MB/s 00:00 lem.sql 100% 9867 4.3MB/s 00:00
mysql> create database lem; Query OK, 1 row affected (0.00 sec) mysql> create database zrlog; Query OK, 1 row affected (0.00 sec) mysql> create database test; Query OK, 1 row affected (0.00 sec)
root@linux-10 ~]# mysql -uroot -p12345678 zrlog < /tmp/lem.sql Warning: Using a password on the command line interface can be insecure. [root@linux-10 ~]# mysql -uroot -p12345678 lem < /tmp/lem.sql Warning: Using a password on the command line interface can be insecure. [root@linux-10 ~]# mysql -uroot -p12345678 test < /tmp/lem2.sql Warning: Using a password on the command line interface can be insecure.
stop slave; //中止同步
change master to master_host='192.168.88.5', master_user='repl', master_password='123456', master_log_file='lemlinux1.000001', master_log_pos=10362;
master_host='192.168.88.5',指定主機器host
master_user='repl',指定主機器用戶
master_password='123456',指定主機器密碼
master_log_file='lemlinux1.000001',指定binlog文件名
master_log_pos=10362,指定binlog文件大小
master_log_file和master_log_pos是由主庫show master status
也能夠指定主機器的port,由於在生產環境中,也會有人更改mysql的默認端口 master_port=端口號,若是是默認端口則無需添加
start slave;
mysql> show slave status\G //\G後不用加分號,自己就是結束符 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.88.5 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: lemlinux1.000003 Read_Master_Log_Pos: 120 Relay_Log_File: linux-10-relay-bin.000005 Relay_Log_Pos: 283 Relay_Master_Log_File: lemlinux1.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
成功的標誌是 Slave_IO_Running和Slave_SQL_Running兩項是否均爲yes
還須要關注
Seconds_Behind_Master: 0 //爲主從延遲的時間
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
unlock tables;
17.5 測試主從同步
主從中有一些配置參數可使數據庫同步時更加精確,具備目的性。
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= //如aming.%, 支持通配符% 指定同步靠譜的匹配 忽略表
使用前4條參數時會有必定的侷限性,例如:有一個臨時表,寫的數據很是快,數據也大,天天都須要刪除或者更新,那麼就不須要天天去作同步,而且在面對聯合查找時,可能會形成數據不完整的狀況,所以在設置主從配置參數時,儘可能使用後兩條。
mysql> use lem 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> show tables; +---------------+ | Tables_in_lem | +---------------+ | comment | | link | | log | | lognav | | plugin | | tag | | type | | user | | website | +---------------+ 9 rows in set (0.00 sec) mysql> select count(*) from website; +----------+ | count(*) | +----------+ | 9 | +----------+ 1 row in set (0.00 sec) mysql> select * from website; +--------+---------------------+----------------------------------------------------------------------+--------+ | siteId | name | value | remark | +--------+---------------------+----------------------------------------------------------------------+--------+ | 1 | rows | 10 | NULL | | 2 | template | /include/templates/default | NULL | | 3 | autoUpgradeVersion | 86400 | NULL | | 4 | pseudo_staticStatus | false | NULL | | 5 | title | lemzrlog | NULL | | 6 | second_title | lem | NULL | | 7 | home | http://192.168.88.5/zrlog/ | NULL | | 8 | zrlogSqlVersion | 4 | NULL | | 9 | plugin_core_db_key | {"pluginInfoMap":{},"setting":{"disableAutoDownloadLostFile":false}} | NULL | +--------+---------------------+----------------------------------------------------------------------+--------+ 9 rows in set (0.00 sec) mysql> truncate table website; Query OK, 0 rows affected (0.01 sec) mysql> select count(*) from website; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec)
mysql> use lem 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 count(*) from website; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec)
從庫的數據也被刪除,說明主從配置成功
如果誤操做了,好比在從機器誤刪除了,再去主上刪除相同的數據,就會有可能致使主從失敗
這時在從機器上 start slave;
而後在start slave;
再來查看show slave status\G
如果仍是失敗,則只能從新作主從了
在主機器的數據庫上 show mater status; 查看文件大小
而後在從機器上先stop slave;
而後直接change master to master_host='192.168.88.5', master_user='repl', master_password='123456', master_log_file='lemlinux1.000001', master_log_pos=10362;
由於基本還沒作什麼操做的,數據仍是一致的,直接改下數據大小就行
而後在從機器上 start slave;
再來查看 show slave status\G 看是否爲兩個Yes,若仍是報錯只能從新從頭作主從了