程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 解決Mysql主從不同步問題

解決Mysql主從不同步問題

編輯:關於MYSQL數據庫

今天MySQL的主從數據庫沒有同步導致網頁讀不到數據,

當網頁不能讀到數據時,猜想上數據庫的原因。

首先在Master上用

show processlist; 查看下進程是否Sleep太多。發現很正常。

show master status; 也正常。

再跑到Slave上查看

show slave status;

錯誤提示:

Error 'Duplicate entry '1' for key 1' on query. Default database: 'movivi1'. Query: 'INSERT INTO `v1vid0_user_samename` VALUES(null,1,'123','11','4545','123')'

Slave_SQL_Running 為 NO

Seconds_Behind_Master 為 (null)

可見是Slave不同步

解決:

stop slave;

set global sql_slave_skip_counter =1 ;

start slave;

之後Slave會和Master去同步 主要看Seconds_Behind_Master是否為0,直到為0時就已經同步了。。

目前情況:
1.系統版本都是rhel5 MySQL版本相同
2.主服務器正在運行,不能停止。
3.主服務器IP為:192.168.1.100
從服務器IP為:192.168.1.101
4.從服務器MSYQL slave 為停止狀態
配置步驟:
1、主庫創建/etc/my.cnf,修改[MySQLd]裡邊的鍵值增加

server-id=1

log-bin=binlog_name

2、主庫增加用戶,用於從庫讀取主庫日志。

grant replication slave,reload,super on *.* to identifIEd by '123456';

flush privileges;

3、從庫連接主庫進行測試。

MySQL -u slave -p -h 192.168.1.100 //master的IP

4、停從庫,修改從庫/etc/my.cnf,增加選項:

[MySQLd]

server-id=2

master-host=192.168.1.100

master-user=slave

master-passWord=123456

5.鎖表

MySQL > FLUSH TABLES WITH READ LOCK;

注意:為了保證FLUSH TABLES語句讓讀鎖定保持有效。(如果退出客戶程序,鎖被釋放)。建立新的SSH連接,然後對主服務器上的數據進行快
照。

6.建立快照
tar -cvf data.tar /var/lib/MySQL
將壓縮包拷貝過去後解壓縮

也可以用scp拷貝過去:
scp -r /var/lib/mysql/* 192.168.1.101:/var/lib/MySQL/
注意拷貝過去後權限的設置
chown -R mysql.mysql /var/lib/MySQL

數據量大可以用MySQLdump導出.

7.解鎖

MySQL > UNLOCK TABLES;

8.記下file pos值
當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時,讀取主服務器上當前的二進制日志名(file)和偏移量值(pos):
MySQL > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73       | test         | manual,MySQL     |
+---------------+----------+--------------+------------------+
File列顯示日志名,而Position顯示偏移量。在該例子中,二進制日志值為MySQL-bin.003,偏移量為73。記錄該值。以後設置從服務器時需要
使用這些值。它們表示復制坐標,從服務器應從該點(也可以是任何點)開始從主服務器上進行新的更新。

9.從服務器執行同步
# MySQL>start slave;
# MySQL>load data from master;

10.驗證配置
登錄從服務器輸入如下命令:

MySQL> show slave status\G;

會得到類似下面的列表:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

都為yes,則配置正確.

11.進行測試:

主庫創建表,

MySQL>create database sampdb;

MySQL>use sampdb;

MySQL>create table new (name char(20),phone char(20));

MySQL>insert into new (’abc‘,’0532555555’);
主從服務器重啟;

打開從庫,查看:
#MySQL -u root -p
MySQL>show databases; //應該能看到master創建的庫sampdb

MySQL

sampdb

test

MySQL>use sampdb;

MySQL>show tables;

說明主從數據庫創建成功。

附:
一些錯誤信息的處理,主從服務器上的命令,及狀態信息。
在從服務器上使用show slave status\G
Slave_IO_Running,為No,
則說明IO_THREAD沒有啟動,請執行start slave io_thread
Slave_SQL_Running為No
則復制出錯,查看Last_error字段排除錯誤後執行start slave sql_thread
查看Slave_IO_State字段空 //復制沒有啟動
Connecting to master//沒有連接上master
Waiting for master to send event//已經連上
主服務器上的相關命令:
show master status
show slave hosts
show logs
show binlog events
purge logs to 'log_name'
purge logs before 'date'
reset master(老版本flush master)
set sql_log_bin=

從服務器上的相關命令:
slave start
slave stop
SLAVE STOP IO_THREAD //此線程把master段的日志寫到本地
SLAVE start IO_THREAD
SLAVE STOP SQL_THREAD //此線程把寫到本地的日志應用於數據庫
SLAVE start SQL_THREAD
reset slave
SET GLOBAL SQL_SLAVE_SKIP_COUNTER
load data from master
show slave status(SUPER,REPLICATION CLIENT)
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWord= //動態改變master信息
PURGE MASTER [before 'date'] 刪除master端已同步過的日志

幾個跟熱備有關的mysql命令:(需要在MySQL命令行界面或query )

    * stop slave    #停止同步
    * start slave    #開始同步,從日志終止的位置開始更新。
    * SET SQL_LOG_BIN=0|1 #主機端運行,需要super權限,用來開停日志,隨意開停,會造成主機從機數據不一致,造成錯誤
    * SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n # 客戶端運行,用來跳過幾個事件,只有當同步進程出現錯誤而停止的時候才可以執行。
    * RESET MASTER #主機端運行,清除所有的日志,這條命令就是原來的FLUSH MASTER
    * RESET SLAVE   #從機運行,清除日志同步位置標志,並重新生成master.info
      雖然重新生成了master.info,但是並不起用,最好,將從機的MySQL進程重啟一下,
    * LOAD TABLE tblname FROM MASTER #從機運行,從主機端重讀指定的表的數據,每次只能讀取一個,受timeout時間限制,需要調整timeout時間。執行這個命令需要同步賬號有 reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值
    * LOAD DATA FROM MASTER #從機執行,從主機端重新讀入所有的數據。執行這個命令需要同步賬號有reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值
    * CHANGE MASTER TO master_def_list #在線改變一些主機設置,多個用逗號間隔,比如
      CHANGE MASTER TO
      MASTER_HOST='master2.mycompany.com',
      MASTER_USER='replication',
      MASTER_PASSWord='bigs3cret'
    * MASTER_POS_WAIT() #從機運行
    * SHOW MASTER STATUS #主機運行,看日志導出信息
    * SHOW SLAVE HOSTS #主機運行,看連入的從機的情況。
    * SHOW SLAVE STATUS (slave)
    * SHOW MASTER LOGS (master)
    * SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [ LIMIT [offset,] rows ]
    * PURGE [MASTER] LOGS TO 'logname' ; PURGE [MASTER] LOGS BEFORE 'date'

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved