一、主從介紹:mysql主從又叫Replication,AB兩臺機器複製,也就是說是AB兩臺機器作了主從後,在A機器上寫數據,另外一臺B機器也會跟中寫數據,二者數據實時同步:mysql
mysql主從是基於binlog,主上必須開啓binlog才能進行主從:binlog是一個二進制的日記文件:linux
mysql主從的過程步驟:web
1:主將更改操做記錄(增刪改)到binlog裏:sql
2:從將主的binlog事件(SQL語句)同步到從本機並記錄relaylog中:數據庫
3:從根據relaylog裏面的語句按數據嚴格執行:vim
註釋:主從過程涉及到三個線程, 主(logdump線程) 從(I/O線程、SQL線程)bash
主上有一個線程(logdump)用來和從的I/O線程傳遞binlog:服務器
從上有兩個線程: I/O線程用來同步主的binlog至本機並生成relaylog: SQL線程用來把relaylog裏的sql語句按數據執行:socket
附記:master主會把操做記錄到binlog中,經過線程dumplog和從線程I/O線程傳遞binlog,從經過線程I/O收到binlog後至本機生成relaylog,並經過線程SQL來按順序執行relaylog裏的sql語句:ide
應用場景:
一、用於備份重要數據:(僅僅只做爲備份):主機器宕機,從機器還能隨時對web提供服務:
二、主從同時對web服務,目的在與減輕主庫壓,從庫做爲一個只讀的庫存在(從mysql只能讀數據,不能寫數據),數據備份的同時可分擔主機器被調用數據時的壓力,mysql主從有方向性,寫數據必須從主機器開始,若是不依照原理會致使數據紊亂:
mysql主從原理圖:以下: Master:主 Slave:從
二、主從操做步驟:首先準備兩臺單獨都運行了mysql的服務器,或者同一臺機器上的兩個mysql實例也能夠(端口不能相同):開啓mysql服務:
mysql的詳細安裝步驟:
1:首先下載mysql二進制免編譯包,放在目錄/usr/local/src
2:解壓壓縮包:
3:解壓以後,把解壓後的mysql目錄及文件放到/usr/local/mysql
註釋:首先查看/usr/local/mysql這個目錄是否存在,存在則修更名稱或者挪到其它目錄:
4:進入到/usr/local/mysql目錄下:建立mysql用戶和數據庫目錄,而後初始化s時使用:
useradd mysqld ; mkdir -p /data/mysql
./scripts/mysql_install_db --user=msyql --datadir=/data/mysql
註釋:此時可能會須要安裝兩個包: perl-Data-Dumper.x86_64 libaio.x86_64 libaio-devel.x86_64
看到安裝過程裏有兩個OK,或者用echo $?測試是0則爲正常:
5:編輯配置文件/etc/my.cnf -------->默認自帶配置文件:
在/etc/my.cnf中: 定義 datadir=/data/mysql 定義 socket=/tmp/mysql.sock
6:拷貝啓動腳本: cp /usr/lcoal/mysql/support-file/mysql.server /etc/init.d/mysqld
在/etc/init.d/mysqld 定義 basedir=/usr/local/mysql 定義 datadir=/data/mysql
7:而後能夠啓動mysqld了,建議查看/data/mysql/的文件和目錄是不是mysql屬主和屬主:啓動會由於不是mysql用戶而沒法啓動:
註釋:若想開機啓動建議設置chkconfig:
mysql主從----主上操做:
1:安裝mysql:
2:修改my.cnf,增長server-id=130和log_bin=aminglinux1
修改完配置後重啓後,啓動或者重啓mysql服務:
註釋:打開binlog二進制日記,自定義前綴amingliunx1,同一個集羣內的server-id不能重複:
3:把zrlog庫備份並恢復成FEKU庫,做爲測試數據:
mysqldump -uroot -pnihao123! zrlog > /tmp/zrlog.sql
mysql -uroot -pnihao123! -e 「create database FYKU」
mysql -uroot -pnihao123! < /tmp/FYKU.sql
4:建立用做同步數據的帳戶,用於主從之間的數據同步:
grant replication slave on *.* to 'repl'@slave_ip identified by 'nihao123!'
5:鎖表,爲了兩邊的數據一致:
flush tables with read lock;
5:show master status; #要記住filename和position的位置:
主從配置-主上詳細操做命令:
一、首先在兩臺機器安裝並啓動mysql,咱們先在主上操做:
二、修改/etc/my.cnf配置文件:定義server-id和binlog:
[root@localhost_02 ~]# vim /etc/my.cnf [root@localhost_02 ~]# cat !$ |grep -v '^#'|grep -v '^$' cat /etc/my.cnf |grep -v '^#'|grep -v '^$' [mysqld] datadir=/data/mysql socket=/tmp/mysql.sock server-id=130 #這個id能夠自定義,本處以當前系統IP地址定義: bin_log=fenye520 #打開binlog日記,定義fenye520爲前綴名稱:
三、重啓啓動mysql服務:
[root@localhost_02 ~]# /etc/init.d/mysqld restart Shutting down MySQL. SUCCESS! Starting MySQL. SUCCESS!
四、這時候咱們查看mysql的數據目錄:會生成兩個文件:fenye520.000005(binlog日記) fenye520.index(索引頁)
#binlog詳細記錄mysql數據庫每一步操做過程,增長和刪除等操做:
[root@localhost_01 ~]# ls -lt /data/mysql/ 總用量 110740 drwx------ 2 mysql mysql 4096 9月 4 14:31 zrlog #原博客的目錄: -rw-rw---- 1 mysql mysql 13853 9月 4 14:22 localhost_02.err -rw-rw---- 1 mysql mysql 5 9月 4 14:22 localhost_02.pid -rw-rw---- 1 mysql mysql 90 9月 4 14:22 fenye520.index #索引頁: -rw-rw---- 1 mysql mysql 1852 9月 4 14:31 fenye520.000005 #binlog: -rw-rw---- 1 mysql mysql 143 9月 4 14:22 fenye520.000004 -rw-rw---- 1 mysql mysql 143 9月 4 14:22 fenye520.000001 -rw-rw---- 1 mysql mysql 143 9月 4 14:21 fenye520.000003 -rw-rw---- 1 mysql mysql 143 9月 4 14:21 fenye520.000002 -rw-rw---- 1 mysql mysql 16384 8月 23 22:12 aria_log.00000001 -rw-rw---- 1 mysql mysql 52 8月 23 22:12 aria_log_control -rw-rw---- 1 mysql mysql 0 8月 23 21:49 multi-master.info -rw-rw---- 1 mysql mysql 50331648 8月 23 21:48 ib_logfile1 -rw-rw---- 1 mysql mysql 56 8月 21 22:00 auto.cnf drwx------ 2 mysql mysql 4096 8月 21 21:10 mysql #mysql自帶的數據庫,存放用戶名密碼等: drwx------ 2 mysql mysql 6 8月 21 21:07 test
註釋: 會生成兩個文件:fenye520.000005(binlog日記) fenye520.index(索引頁)
.index:索引頁,這個文件是必需要有的:
.000001:這個是二進制binlog文件,會持續生成2 3 4等等(這個文件是實現主從配置的根本,沒有這個文件則沒辦法完成主從):
五、測試:準備用mysql數據庫下zrlog作演示用:
首先作一個備份: mysqldump -uroot -pnihao123! zrlog > /tmpt/zrlog.sql
[root@localhost_01 ~]# mysqldump -uroot -pnihao123! zrlog > /tmp/zrlog.sql Warning: Using a password on the command line interface can be insecure. [root@localhost_02 ~]# ls /tmp/zrlog.sql /tmp/zrlog.sql
建立一個新的庫: mysql -uroot -pnihao123! -e "create databese FYKU"
[root@localhost_01 ~]# mysql -uroot -pnihao123! -e "create database FYKU" Warning: Using a password on the command line interface can be insecure.
建立好庫後,在把數據恢復一下,也就是說主從是以FYKU這個庫爲準的:
[root@localhost_01 ~]# mysql -uroot -pnihao123! FYKU < /tmp/zrlog.sql Warning: Using a password on the command line interface can be insecure.
六、再次查看/data/mysql下的文件,能看到fenye520.000001這個文件有增長的:
七、下面建立用於主從同步數據時所需的用戶和密碼: 也就是binlog和I/Olog之間使用:
grant replication slave on *.* 'repl'@slave_ip identified by 'nihao123!';
[root@localhost_01 ~]# mysql -uroot -pnihao123! mysql> grant replication slave on *.* to 'repl'@192.168.149.129 identified by 'nihao123!'; Query OK, 0 rows affected (0.01 sec)
replication slave 指定權限,
*.* 表示全部庫全部表:
repl@192.168.149.129: 指定用戶以及來源IP,指定all會很危險:
八、鎖定表,目的是不讓變繼續寫數據,由於一會從要同步數據,須要進行一個同步,讓二者的數據相同:
mysql> flush tables with read lock; Query OK, 0 rows affected (0.04 sec)
九、查看一下binlog文件的大小,並記住filename:
mysql> show master status; +-----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------+----------+--------------+------------------+-------------------+ | fenye520.000005 | 9946 | | | | +-----------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
十、退出數據庫,作了一個數據同步:
查看/data/mysql目錄,主上有哪些庫,一下子從上也要有這些庫,主從同步,就是把這些庫同步到從上面:
[root@localhost_01 ~]# ls /data/mysql/ aria_log.00000001 fenye520.000001 fenye520.000004 FYKU ib_logfile0 localhost_02.err mysql zrlog aria_log_control fenye520.000002 fenye520.000005 ib_buffer_pool ib_logfile1 localhost_02.pid performance_schema auto.cnf fenye520.000003 fenye520.index ibdata1 localhost_002.err multi-master.info test
備份其餘的庫並查看全部的庫: mysqldump -uroot -pnihao123! test > /tmp/test.sql
[root@localhost_01 ~]# mysqldump -uroot -pnihao123! test > /tmp/test.sql Warning: Using a password on the command line interface can be insecure. [root@localhost_01 ~]# ls /tmp/*.sql /tmp/test.sql /tmp/zrlog.sql
註釋:等一下子後要把/tmp/目錄下的*.sql的文件拷貝到從的上面:
由此主上操做完成,接下來操做從:
主從配置——從上操做:
1:安裝mysql:
2:查看/etc/my.cnf,配置server-id: #無需配置binlog:
重啓啓動mysql:
把主上的zrlog庫同步到從上:能夠先在從上建立相應zrlog FEKU庫,而後把主上/tmp/*.sql拷貝到主上,而後導入zrlog庫:
scp 192.168.149.130/tmp/*.sql /tmp/
三、mysql -uroot -pnihao123
stop slave;
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
start slave;
最後去主上執行 unlock tables;
主從配置---從上操做:
一、修改/etc/my.cnf文件,定義server-id #註釋:從上不須要定義binlog:
[root@localhost_02 ~]# vim /etc/my.cnf [mysqld] datadir=/data/mysql socket=/tmp/mysql.sock server-id=129 #此處用IP地址定義的:
二、重啓啓動mysql服務:
[root@localhost_02 ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL. SUCCESS!
而且再增長server-id後,對數據庫目錄/data/mysql沒有任何變化:
[root@localhost_02 ~]# ls /data/mysql/ auto.cnf ibdata1 ib_logfile0 ib_logfile1 localhost_02.err localhost_02.pid mysql performance_schema test
3:而後把主機器上的.sql數據拷貝到從機器上,作一個數據恢復: scp 192.168.149.130:/tmp/*.sql /tmp/
[root@localhost_02 ~]# scp -P 52588 192.168.149.130:/tmp/*.sql /tmp/ root@192.168.149.130's password: test.sql 100% 1259 926.8KB/s 00:00 zrlog.sql 100% 7713 488.5KB/s 00:00 [root@localhost_02 ~]# ls /tmp/*.sql /tmp/test.sql /tmp/zrlog.sql
4:在從數據庫上建立相應的庫: zrlog FYKU庫:
[root@localhost_02 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. mysql> create database zrlog; Query OK, 1 row affected (0.00 sec) mysql> create database FEKU; Query OK, 1 row affected (0.00 sec)
5:而後對數據庫作個恢復: mysql -uroot zrlog < /tmp/zrlog.sql
[root@localhost_02 ~]# mysql -uroot zrlog < /tmp/zrlog.sql [root@localhost_02 ~]# mysql -uroot FYKU < /tmp/zrlog.sql [root@localhost_02 ~]# mysql -uroot test < /tmp/test.sql
註釋;要保證兩邊的數據一致,查看兩個目錄的文件目錄是否相同:
開始實現主從:
6:登陸從機器,執行stop slave操做:
[root@localhost_02 ~]# mysql -uroot Welcome to the MySQL monitor. Commands end with ; or \g. mysql> stop slave; Query OK, 0 rows affected, 1 warning (0.00 sec)
7:在從機器配置同步的相關配置(主機名、用戶名、密碼、日記文件等):
change master to master_host='192.168.149.130', master_user='repl', master_password='nihao123!', master_log_file='fenye520.000005', master_log_pos=9946;
master_host=192.168.149.130:指定主機器host:
master_user='repl':指定主機器用戶:
master_password='nihao123!':指定主機器密碼:
master_log_file='fenye520.000005':指定binlog文件名:
master_log_pos='9949':指定binlog文件大小:
master_port=' ':指定主機的端口,由於在生產環境中,不多有人會修改mysql的默認端口,此選項通常極少使用:
mysql> change master to master_host='192.168.149.130', master_user='repl', master_password='nihao123!', master_log_file='fenye520.000005', master_log_pos=9946; Query OK, 0 rows affected, 2 warnings (0.06 sec)
8:開啓start salve:
mysql> start slave; Query OK, 0 rows affected (0.01 sec)
最後須要解鎖主上的表(在mysql主上操做): unlock table;
[root@localhost_01 ~]# mysql -uroot -pnihao123! Warning: Using a password on the command line interface can be insecure. mysql> unlock table; Query OK, 0 rows affected (0.00 sec)
到這一步了,mysql主從就搭建完成:
註釋:能夠經過 從上show slave status\G 判斷主從是否配置成功:
注意: \G後面不須要加分號,\G自己就是結束符:
看 Slave_IO_Running: Yes 是否爲yes
看 Slave_SQL_Running: Yes 是否爲yes
註釋:有時可能防火牆或者SElinux會影響到此處這兩個選項:
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.149.130 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: fenye520.000005 Read_Master_Log_Pos: 9946 Relay_Log_File: localhost_02-relay-bin.000002 Relay_Log_Pos: 282 Relay_Master_Log_File: fenye520.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes 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: 9946 Relay_Log_Space: 462 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 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: 130 Master_UUID: 94f8afad-a54a-11e8-935c-000c2981f44b Master_Info_File: /data/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec)
註釋:如何主從同步是否正常:
首先在從上執行登陸mysql,而後執行 show slave status\G
查看是否有:
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:
幾個配置參數狀況以下:
主服務器:
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.%, 支持通配符% 指定同步靠譜的匹配 忽略表
註釋:進行從服務器的配置時儘可能使用參數「replicate_wild_」,使匹配更精確,提高使用性能
三、主從測試:
一、主上操做:mysql -uroot -pnihao123
use zrlog;
select count(*) from t1111;
truncate table db;
二、從上 mysql -uroot aming
select count(*) from t111;
主上繼續drop table t111;
從上查看tables表:
主上操做:進入到mysql,並查看有幾個表: show tables;
[root@localhost_01 ~]# mysql -uroot -pnihao123! Warning: Using a password on the command line interface can be insecure. mysql> use zrlog Database changed mysql> show tables; +-----------------+ | Tables_in_zrlog | +-----------------+ | t1111 | | t112312312 | | t2222 | | t3333 | | t334tasgs | | t44444 | +-----------------+ 12 rows in set (0.00 sec)
主上操做:此時咱們在主上往t1111表裏插入一條數據:
mysql> insert into t1111 values(10); Query OK, 1 row affected (0.00 sec) mysql> select count(*) from t1111; +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
從上操做:此時來從上zrlog庫裏t1111表查看,看到的內容是同樣的:
mysql> use zrlog; mysql> select count(*) from t1111; +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
註釋:truncate table t1111; 表示清空表的內容:
第二次操做:在主上刪除這個t1111表,而後在從上觀察:
主上操做:刪除t1111這個表: drop table t1111;
mysql> drop table t1111; Query OK, 0 rows affected (0.00 sec) mysql> show tables; +-----------------+ | Tables_in_zrlog | +-----------------+ | t112312312 | | t2222 | | t3333 | | t334tasgs | | t44444 | 11 rows in set (0.00 sec)
從上操做:在從上查看: show table t1111;
mysql> show tables; +-----------------+ | Tables_in_zrlog | +-----------------+ | t112312312 | | t2222 | | t3333 | | t334tasgs | | t44444 | 11 rows in set (0.00 sec)
註釋:發現從上的表t1111也被刪除了:
註釋:如果誤操做了,好比在從機器誤刪除了,再去主上刪除相同的數據,就會有可能致使主從失敗
這時在從機器上 stop slave;
而後在start slave;
再來查看show slave status\G
如果仍是失敗,則只能 從新作主從了:
如何從新作主從呢:
在主機器的數據庫上 show mater status;
查看文件大小:並記錄到那個position:
而後在從機器上先stop slave;
而後直接change master to master_host='192.168.180.134', master_user='repl', master_password='123456', master_log_file='yueyong123.000001', master_log_pos=10470;
#僅僅只修改後面的master_log_pos=' ';這步就能夠了:
由於基本還沒作什麼操做的,數據仍是一致的,
直接改下數據大小就能夠了:
而後在從機器上 start slave;
再來查看 show slave status\G 看是否爲兩個Yes: