- 論壇徽章:
- 0
|
在unix環(huán)境下在/etc/mysql/my.cnf 或者在mysql用戶的home目錄下面的my.cnf。
window環(huán)境中,如果c:根目錄下有my.cnf文件則取該配置文件。當(dāng)運(yùn)行mysql的winmysqladmin.exe工具時(shí)候,該工具會(huì)把c:根目錄下的my.cnf 命名為mycnf.bak。并在winnt目錄下創(chuàng)建my.ini。mysql服務(wù)器啟動(dòng)時(shí)候會(huì)讀該配置文件。所以可以把my.cnf中的內(nèi)容拷貝到my.ini文件中,用my.ini文件作為mysql服務(wù)器的配置文件。
unix/linux環(huán)境下,就修改/etc/mysql/my.cnf然后/usr/local/mysql/share/mysql/mysql server restart就可以了。
我的測(cè)試環(huán)境:
操作系統(tǒng):redhat AS 3
mysql:mysql-4.0.17.
A ip:192.168.0.90
B ip:192.168.0.99
A:設(shè)置
1.增加一個(gè)用戶最為同步的用戶帳號(hào):
GRANT all privileges ON *.* TO backup@'192.168.0.99' IDENTIFIED BY ‘1234’
B:設(shè)置
1.增加一個(gè)用戶最為同步的用戶帳號(hào):
GRANT replication slave ON *.* TO backup@'192.168.0.90' IDENTIFIED BY ‘1234’
說(shuō)明:上面的all privileges在4.0版上應(yīng)該為replication slave,也就是grant replication slave on........在0.99上是file,也就是grant file on ........但是我怕有別的麻煩,干脆權(quán)限全給好啦. 在進(jìn)行如上設(shè)置之后,可以看出在192.168.0.99設(shè)定好并重啟mysql以后,mysql會(huì)在數(shù)據(jù)目錄(/var/lib/mysql)下生成一個(gè)master.info文件和relay-log.info,relay-log.index文件.如果要更改master服務(wù)器,則要?jiǎng)h除掉這個(gè)文件,(即在更改了/etc/my.cnf中master相關(guān)信息)在my.cnf文件中重新配置,重新啟動(dòng)mysql,更改才會(huì)生效.
.主從模式:A->B
A為master
修改A mysql的my.ini文件。在mysqld配置項(xiàng)中加入下面配置:
server-id=1
log-bin
#設(shè)置需要記錄log 可以設(shè)置log-bin=/var/mysqllog 設(shè)置日志文件的目錄,
#其中mysqllog是日志文件的名稱,mysql將建立不同擴(kuò)展名,文件名為mysqllog的幾個(gè)日志文件。
binlog-do-db=test #指定需要日志的數(shù)據(jù)庫(kù)
這樣,mysql會(huì)在數(shù)據(jù)目錄放置test這個(gè)庫(kù)的更新日志。等待備機(jī)來(lái)抓取
重起數(shù)據(jù)庫(kù)服務(wù)。
用show master status 命令看日志情況。
B為slave
修改B mysql的my.ini文件。在mysqld配置項(xiàng)中加入下面配置:
server-id=2
master-host=192.168.0.90
master-user=backup #同步用戶帳號(hào)
master-password=1234
master-port=3306
master-connect-retry=10 預(yù)設(shè)重試間隔10秒
replicate-do-db=test 告訴slave只做backup數(shù)據(jù)庫(kù)的更新
log-bin
binlog-do-db=test客戶端會(huì)到服務(wù)器抓取test庫(kù)的更新日志,來(lái)更新本地的test庫(kù)
重起數(shù)據(jù)庫(kù)
用show slave status看同步配置情況。
注意:由于設(shè)置了slave的配置信息,mysql在數(shù)據(jù)庫(kù)目錄下生成master.info
所以如有要修改相關(guān)slave的配置要先刪除該文件。否則修改的配置不能生效。
雙機(jī)互備模式。
如果在A加入slave設(shè)置,在B加入master設(shè)置,則可以做B->A的同步。
在A的配置文件中 mysqld 配置項(xiàng)加入以下設(shè)置:
master-host=192.168.0.99
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中 mysqld 配置項(xiàng)加入以下設(shè)置:
log-bin
binlog-do-db=backup
注意:當(dāng)有錯(cuò)誤產(chǎn)生時(shí)*.err日志文件。同步的線程退出,當(dāng)糾正錯(cuò)誤后要讓同步機(jī)制進(jìn)行工作,運(yùn)行slave start
重起AB機(jī)器,則可以實(shí)現(xiàn)雙向的熱備。
對(duì)于故障診斷,我的方法是都在在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有兩個(gè)線程,I/O thread和SQL thread,I/O 的作用是從master 3306端口上把它的binlog取過來(lái)(master在被修改了任何內(nèi)容之后,就會(huì)把修改了什么寫到自己的binlog等待slave更新),然后寫到本地的relay-log,而SQL thread則是去讀本地的relay-log,再把它轉(zhuǎn)換成本Mysql所能理解的東西,于是同步就這樣一步一步的完成.決定I/O thread的是/var/lib/mysql/master.info,而決定SQL thread的是/var/lib/mysql/relay-log.info.
請(qǐng)注意,因?yàn)樯线吿岬搅薭inlog里的內(nèi)容是改了什么東東,而不是改了以后是什么東東,所以在進(jìn)行同步之前必須保證兩個(gè)數(shù)據(jù)庫(kù)是完全相同的,不然可能出錯(cuò).打個(gè)比方來(lái)說(shuō).A機(jī)上有一個(gè)表里的元組為2,而操作是減一,則binlog只會(huì)記錄減一這個(gè)操作,如果B機(jī)上沒有,那么則無(wú)法得到同步,因?yàn)锽機(jī)沒有這個(gè)字段,就不知道減一是什么操作.
對(duì)于故障診斷,我的方法是都在slave(master/slave是相對(duì)的)的mysql(指客戶端)里完成.
方法一:show slave status;
正確情況下應(yīng)該同如下類似:
mysql> show slave status;
+--------------+-------------+-------------+---------------+-------------------- --+---------------------+----------------------+---------------+---------------- -------+------------------+-------------------+-----------------+--------------- ------+------------+------------+--------------+---------------------+---------- -------+
| Master_Host | Master_User | Master_Port | Connect_retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Lo g_File | Slave_IO_Running | Slave_SQL_Running | Replicate_do_db | Replicate_igno re_db | Last_errno | Last_error | Skip_counter | Exec_master_log_pos | Relay_log _space |
+--------------+-------------+-------------+---------------+-------------------- --+---------------------+----------------------+---------------+---------------- -------+------------------+-------------------+-----------------+--------------- ------+------------+------------+--------------+---------------------+---------- -------+
| 192.168.0.90 | backup | 3306 | 10 | localserver1-bin.00 1 | 957 | server-relay-bin.005 | 613 | localserver1-bi n.001 | Yes | Yes | test | | 0 | | 0 | 957 | 613 |
+--------------+-------------+-------------+---------------+-------------------- --+---------------------+----------------------+---------------+---------------- -------+------------------+-------------------+-----------------+--------------- ------+------------+------------+--------------+---------------------+---------- -------+
1 row in set (0.00 sec)
上邊的server1和Server是兩臺(tái)機(jī)器的主機(jī)名,所以真實(shí)情況應(yīng)該有所分別,注意其中的YES|YES,這個(gè)是本地I/O線程及SQL線程的工作狀態(tài),要確
保都為YES,如果不是YES,請(qǐng)檢查mysql是否正常運(yùn)行.
方法二:show processlist;
如果正確,則應(yīng)該如下所示:
mysql> show processlist;
+----+-------------+-----------+------+---------+------------+-----------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------------+-----------------------------------------------------------------------+------------------+
| 1 | system user | | NULL | Connect | 2511 | Waiting for master to send event | NULL |
| 2 | system user | | NULL | Connect | 4294906139 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 3 | root | localhost | test | Query | 0 | NULL | show processlist |
| 4 | root | localhost | test | Sleep | 1478 | | NULL |
+----+-------------+-----------+------+---------+------------+-----------------------------------------------------------------------+------------------+
4 rows in set (0.00 sec)
注意同標(biāo)記過的字符類似,則是正確的,錯(cuò)誤情況下應(yīng)該是這個(gè)樣子:
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------------------
---+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------------------
---+------------------+
| 4 | system user | | NULL | Connect | 454 | Reconnecting after a failed master event read | NULL |
| 5 | system user | | NULL | Connect | 454 | Has read all relay log; waiting for the I/O slave thread to update it | NULL |
| 7 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------------------
---+------------------+
3 rows in set (0.00 sec)
當(dāng)然如果這里的Reconnecting只是錯(cuò)誤的一種,有可能是connecting,則表示正在連接,那么請(qǐng)檢查:
1 master上的mysql daemon是否正常運(yùn)行
2 master與slave的網(wǎng)絡(luò)連接是否正常
3 my.cnf是否配置正確
4 在修改配置后是否刪除過master.info?(刪掉以后會(huì)自動(dòng)再生成一個(gè),別擔(dān)心刪掉),因?yàn)槿绻粍h掉的話,那么則還是使用原來(lái)的配置
5 修改配置后有沒有重新啟動(dòng)mysql daemon,重新啟動(dòng)過程后必須證實(shí)mysql已經(jīng)正常啟動(dòng)
6 master上給slave及slave給master上分配的replication用戶權(quán)限是否正確,master的主機(jī)名和dns設(shè)置
7 當(dāng)前狀況兩臺(tái)數(shù)據(jù)庫(kù)是否完全相同.
方法三:show master status;
mysql> show master status;
+----------------+----------+--------------+------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+----------------+----------+--------------+------------------+
| Server1-bin.021 | 79 |test | |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注意上邊的這條,position不能為0,如果為0則表示有問題,請(qǐng)檢查/etc/my.cnf中的server-id及是否打開log-bin
mysql> show processlist;
+----+--------+---------------------+------+-------------+------+-----------------------------------------------------------
-----+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+--------+---------------------+------+-------------+------+-----------------------------------------------------------
-----+------------------+
| 1 | backup | 192.168.0.99:32996 | NULL | Binlog Dump | 284 | Has sent all binlog to slave; waiting for binlog to be
updated | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+--------+---------------------+------+-------------+------+-----------------------------------------------------------
-----+------------------+
2 rows in set (0.00 sec)
如果master上不是這樣,那么就應(yīng)該是master的配置有問題啦.
方法四 查看錯(cuò)誤日志
在 /usr/local/mysql/var下有個(gè) localhost.err 文件,所有的錯(cuò)誤都在其中被記錄
ps:
至于多機(jī)熱備怎么做?
我G和B了網(wǎng)上教程說(shuō)到“將幾臺(tái)mysql服務(wù)器像首尾相連的蛇,組成一個(gè)環(huán)裝,就可以了,而且還可以作幾個(gè)單向的更新,用以分擔(dān)select這樣的讀取操作的壓力” 具體偶也沒做過,不太清楚。有網(wǎng)友有成功案例的請(qǐng)分享。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/16615/showart_92753.html |
|