MySQL主從備份

本文目錄結構: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 ,其餘字段參考參數定義自行設置, 配置文件中相關參數定義以下:

相關文章
相關標籤/搜索