本文目錄結構:html
1.主從複製mysql
1.1簡介sql
1.2實操數據庫
1.3問題處理服務器
其餘:my.cnf主從配置參數ide
1.主從複製測試
1.1簡介.net
原理
主服務器數據庫的每次操做都會記錄在二進制日誌文件mysql-bin.xxx中。從服務器的I/O線程使用專用賬號登錄到主服務器中讀取該二進制文件,並將文件內容寫入到本身本地的中繼日誌relay-log文件中。而後從服務器的SQL線程會根據中繼日誌中的內容執行SQL語句,這要求兩臺服務器有一樣的初態。
邏輯步驟:
1)主服務器數據庫的每次操做都會記錄在二進制日誌文件mysql-bin.xxx中.
2)從庫的IO線程向主庫的主進程發送請求,主庫驗證從庫,交給主庫IO線程負責數據傳輸
3)主庫IO線程對比從庫發送過來的master.info裏的信息,將binlog文件信息,偏移量和binlog文件名等發送給從庫
4)從庫接收到信息後,將binlog信息保存到relay-bin中,同時更新master.info的偏移量和binlog文件名
5)從庫的SQL線程不斷的讀取relay-bin的信息,同時將讀到的偏移量和文件名寫道relay-log.info文件,binlog信息寫進本身的數據庫,一次同步操做完成。
6)完成上次同步後,從庫IO線程不斷的向主庫IO線程要binlog信息線程
形式:
一主一從,一主多從,多主一從,主主複製,聯級複製。日誌
用途:
實時災備,讀寫分類,備份。
條件:
主庫開啓binlog日誌
主從server-id不一樣
從庫能夠連到主庫
1.2.實操配置
1)同步初態
先將主機數據庫加鎖,避免數據改變
>use tatabase_name;
>flush tables with read lock;
再將主機數據備份
mysqldump -uroot -pxxx database_name > database_name.sql
備份完後解鎖數據庫
>unlock tables;
在從機從機相同的數據庫,而後導入數據
>create table database_name;
>use database_name;
>source database_name.sql;
2)主機打開二進制日誌
在/etc/my.cnf主要配置以下內容:
log-bin=my-bin #開啓二進制日誌
server-id=1 #設置爲主庫,server-id值爲1
修改後重啓mysql服務
3)查看主機日誌記錄狀態
>show master status\G
顯示內容格式以下,記住此狀態,後面用到
***************** 1. row **************** File: my-bin.000001 #當前記錄的日誌 Position: 553 #日誌中記錄的位置 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
4)主機登陸mysql建立容許從服務器同步數據的帳號
> grant replication slave on *.* to 'user_name'@'slave_ip' identified by 'pass_word';
5)配置從機mysql,在從機/my.cnf配置以下內容:
log-bin=my-bin #開啓二進制日誌 server-id= 2 #主數據庫id爲1,不能相同。 replicate_wild_do_table=copytest.% #只同步copytest庫下的表,能夠不配置此項 relay_log=mysqld-relay-bin #記錄中繼日誌 log-slave-updates=YES #從服務器同步後記錄日誌
也能夠添加如下兩行指定開啓日誌的庫:
binlog_do_db=db_name1;db_name2 --指定同步的數據庫
binlog_ignore_db=db_name3;db_name4 --指定不一樣步的數據庫
注意:若是配置binlog_do_db其餘庫都將被忽略
修改完後重啓mysql
6)根據前面在主機配置的帳號,在從機登陸mysql後打開同步功能
> change master to master_host='master_ip',master_user='user_name',master_password='pass_word',master_log_file='my-bin.000001',master_log_pos=553;
配置完後從起msyql的slave服務
> slave start;
7)查看從服務器是否成功開啓同步
>show slave status\G
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.225 Master_User: user_name Master_Port: 3306 Connect_Retry: 60 Master_Log_File: my-bin.000001 Read_Master_Log_Pos: 1114 Relay_Log_File: mysqld-relay-bin.000004 Relay_Log_Pos: 1260 Relay_Master_Log_File: my-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: test.% Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1114 Relay_Log_Space: 1563 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: 1 1 row in set (0.00 sec)
其中:Slave_IO_Running和Slave_SQL_Running的狀態都是YES,說明同步開啓成功。
如今就能夠去主服務器上的test庫下建立表開測試同步了
1.3問題處理
1)主服務器:show master status\G 輸出Empty set
參考博文:https://blog.csdn.net/lanyang123456/article/details/85221071
緣由:MySQL沒有開啓日誌,能夠登陸MySQL以下查看
mysql> show variables like '%log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+-------+ 6 rows in set (0.00 sec)
能夠看到log_bin爲關閉狀態,在mysql 配置文件 /etc/my.cnf中
[mysqld]下添加:
log-bin=my-bin
而後重啓MySQL,再次查看master狀態:
mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: my-bin.000001 Position: 245 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
log-bin配置項表示binlog的base name,產生的日誌文件名相似:my-bin.00001,my-bin.00002...
show master status命令列出了日誌位點信息,包括binlog file,binlog position等。
2)從服務器:show slave status\G 發現Slave_IO_Runing:No
參考博文:https://blog.csdn.net/xu1314/article/details/7693906
參考博文:https://www.cnblogs.com/l-hh/p/9922548.html
注意查看從機 Last_IO_Error,下面緣由可能不許,但這兒是保存信息,能夠根據這定位
可能緣由:
a)slave沒有訪問master的權限,應檢查master的權限配置和slaver的登陸master帳號配置,以及通訊。
b)slave的master日誌文件配置與主服務器不一致
使用show slave status\G 查看從機狀態,使用show master status\G 查看主機狀態,此時slave的Last_IO_Error提示:
Coud not find find first log file name in binary log index file --文件名不對
Misconfigured master -server id was not set --主機的server-id沒有配置,要配置且爲1,而後從起主機的MySQL和從機的slave
Client requested master to start replication from impossible position;the... --從機讀取主機日誌位置超過主機日誌最大位置
本人緣由:文件不對和主機server-id未配置,處理以下
主機配置my.cnf中的server-id,值爲1
主機從起msyql
中止從機slave:slave stop
從機修改配置:CHANGE MASTER TO MASTER_LOG_FILE='主機的File', MASTER_LOG_POS=0或比主機的Position小的正數;
從機啓動slave:slave start
其餘1:my.cnf主從配置主要參數
設置主數據庫的參數信息,主要設置字段爲server-id,log_bin,binlog_do_db ,其餘字段參考參數定義自行設置, 配置文件中相關參數定義以下: