今天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'