Mysql主從複製以及常見錯誤問題分析

                                                 Mysql主從複製以及常見錯誤問題分析mysql

1、主從複製簡介:sql


一、mysql主從複製原理:bash

    Mysql主從複製的實現,主要依賴於二進制日誌來實現,過程主要是根據把主的MySQL 的數據複製到其它主機( Slave )上。在複製過程當中,能夠理解爲一臺mysql服充當服務器,而其餘的mysql服務器充當從服務器,而這種從服務器能夠是一個或者是多個。在主從複製過程當中,mysql-master會將更新寫入二進制日誌,並維護文件的一個索引以跟蹤日誌循環。開啓的二進制,mysql主服務器就會安裝你配置的二進制文件名生成二進制文件,而這些日誌主要是用來記錄發送到從服務器的更新。當一個從服務器鏈接主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置,從服務器接收從那時起發生的任何更新。mysql要作到主從複製,實際上是把事務都記錄到二進制日誌上,只須要從服務拿到這份日誌,照着日誌上面的動做施加到本身身上就能夠了。這樣就實現了主從複製。服務器


2. MySQL二進制複製類型  ide

     Mysql主從的複製能夠有三種複製類型,分別是:語句的複製STATEMEN,行的複製ROW和混合類型的複製MIXED,語句的複製顧名思義就是在主服務器上執行的SQL語句,在從服務器上執行一樣的語句,行的複製就是把改變的內容複製過去,而不是把命令在從服務器上執行一遍。默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製,配置,複製類型能夠經過binlog_format =在配置文件上配置spa


3. mysql實現主從複製的目的rest

     Mysql配置主從複製的目的,是爲了實現數據的備份,實現數據的高可用性和容錯行日誌

四、實現mysql複製要注意的細節orm

    1)、每臺mysql上都要有惟一的server_id,並且主服務器的id要比全部的從服務器的id要小。server

    2)、Master 能夠有不少 Slave,但每一個 Slave 只能有一個 Master


2、mysql主從複製實現


一、配置主從,開啓二進制:

 1)Master配置:

 #Cat /etc/my.cnf

[mysqld]
 datadir=/var/lib/mysql
 log-bin=/var/lib/mysql/log-bin
 server-id = 1
 binlog_format = 'MIXED'


重啓mysql服務:

#systemctl restart mysql


 2)Slave配置:

 #Cat /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
server-id = 3
skip-grant-tables
log_slave_updates = 1
read_only = 1

##skip-grant-tables、log_slave_updates和read_only是我額外添加的,能夠不添加。只要陪配置server-id就能夠了。

#重啓slave服務器

#systemctl restart mysql

二、主庫查看二進制:

先作一個全備份

# mysqldump -uroot --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > xiaozhang.sql

進入master查看是否啓用了日誌

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

三、主庫建立同步用戶

mysql> GRANT  ALL  ON *.* TO 'rsync'@'%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;

四、主庫上查看數據結點

mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| log-bin.000007 |      120 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

五、從庫上面同步

mysql>CHANGE MASTER TO MASTER_HOST='10.100.10.10',MASTER_USER='rsync',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000007',MASTER_LOG_POS=120;
mysql>start slave;  ##開啓slave模式

六、查看是否實現同步成功

mysql>  show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.100.10.10

                  Master_User: rsync

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: log-bin.000007

          Read_Master_Log_Pos: 120

               Relay_Log_File: szthdb02-relay-bin.000002

                Relay_Log_Pos: 281

        Relay_Master_Log_File: log-bin.000007

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

##能夠發現Slave_IO_Running,和Slave_SQL_Running已經都爲yes說明主從複製配置成功


3、配置過程常見錯誤分析


一、 Slave_IO_Running爲No

查看日誌你會發現有這個錯誤

[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

錯誤分析:

出現這個問題必定是,你的MASTER_LOG_FILE的文件名不對。

解決方法:認真核對你的MASTER_LOG_FILE的文件名,看看是不是你在鏈接的時候多加了個空格。


二、 Slave_SQL_Running爲No

錯誤分析:通常是slave機器重起後,事務回滾形成的。

解決辦法:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;


4、添加備份腳本


腳本的的做用是週一到週五天天作一個增量備份,一個星期作一個全備

#!/bin/bash 
Mysqldump() {
mysqldump -uroot -p123456 --single-transaction -R --triggers -E --master-data --flush-logs --all-databases > /var/lib/mysql/`date +%F"-%H:%M"`.sql
 }$0
Mysql_log (){
mysqladmin -uroot -p123456  flush-logs
}$0
crontab_dump () {
  cat /etc/crontab | grep "bash $0 Mysqldump "  
  if [ $? -eq 0 ]; then
     echo "Task was writen, it will  perform the task at 00:00"
  else
     echo "0 0 * * 6  bash $0 Mysqldump " >> /etc/crontab
  fi
     
} crontab_dump
crontab_mysqladmin () {
  cat /etc/crontab | grep "bash $0 Mysql_log "  
  if [ $? -eq 0 ]; then
     echo "Task was writen, it will  perform the task at 00:00"
  else
     echo "0 0 * * 1-5   bash $0 Mysql_log " >> /etc/crontab
  fi     
} crontab_mysqladmin
##執行腳本後就基本實現了二進制+增備+全備

5、總結


   以上就是個人實現過程,以及遇到問題的解決方法,也許你會認爲很簡單,可是但你配置到時候,老是會出現一些小問題,緣由就是本身還不夠當心嚴謹。因此之後要多注意才行。

相關文章
相關標籤/搜索