在 unix 环境下在 /etc/mysql/my.cnf 或 者在 mysql 用户的 home 目录下面的 my.cnf 。
window 环境中,如果 c: 根目录下有 my.cnf 文件则取该配置文件。当运行 mysql 的 winmysqladmin.exe 工具时候,该工具会把 c: 根目录下的 my.cnf 命名为 mycnf.bak 。并在 winnt 目录下创建 my.ini 。 mysql 服务器启动时候会读该配置文件。所以可以把 my.cnf 中的内容拷贝到 my.ini 文件中, 用 my.ini 文件作为 mysql 服务器的配置文件。
unix/linux环境下,就修改/etc/mysql/my.cnf然后/usr/local/mysql/share/mysql/mysql server restart就可以了。
我的测试环境:
操作系统: redhat AS 3
mysql : mysql-4.0.17.
A ip:192.168.0.90
B ip:192.168.0.99
A: 设置
1. 增加一个用户最为同步的用户帐号:
GRANT all privileges ON *.* TO backup@'192.168.0.99' IDENTIFIED BY ‘1234’
B: 设置
1. 增加一个用户最为同步的用户帐号:
GRANT replication slave ON *.* TO backup@'192.168.0.90' IDENTIFIED BY ‘1234’
说明:上面的all privileges在4.0版上应该为replication slave,也就是grant replication slave on........在0.99上是file,也就是grant file on ........但是我怕有别的麻烦,干脆权限全给好啦. 在进行如上设置之后,可以看出在192.168.0.99设定好并重启mysql以后,mysql会在数据目录(/var/lib/mysql)下生成一 个master.info文件和relay-log.info,relay-log.index文件.如果要更改master服务器,则要删除掉这个文 件,(即在更改了/etc/my.cnf中master相关信息)在my.cnf文件中重新配置,重新启动mysql,更改才会生效.
. 主从模式: A->B
A 为 master
修改 A mysql 的 my.ini 文件。在 mysqld 配置项中加入下面配置:
server-id=1
log-bin
# 设置需要记录 log 可以设置 log-bin=/var/mysqllog 设置日志文件的目录,
# 其中 mysqllog 是日志文件的名称, mysql 将建立不同扩展名,文件名为 mysqllog 的几个日志文件 。
binlog-do-db=test # 指定需要日志的数据库
这样,mysql会在数据目录放置test这个库的更新日志。等待备机来抓取
重起数据库服务。
用 show master status 命令看日志情况。
B 为 slave
修改 B mysql 的 my.ini 文件。在 mysqld 配置项中加入下面配置:
server-id=2
master-host=192.168.0.90
master-user=backup # 同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=10 预设重试间隔 10 秒
replicate-do-db=test 告诉 slave 只做 backup 数据库的更新
log-bin
binlog-do-db=test
客户端会到服务器抓取test库的更新日志,来更新本地的test库
重起数据库
用 show slave status 看同步配置情况。
注意:由于设置了 slave 的配置信 息, mysql 在数据库目录下生成 master.info
所以如有要修改相关 slave 的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在 A 加入 slave 设置,在 B 加入 master 设置,则可以做 B->A 的同 步。
在 A 的配置文件中 mysqld 配置项加入以下设置:
master-host=192.168.0.99
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在 B 的配置文件中 mysqld 配置项加入以下设置:
log-bin
binlog-do-db=backup
注意:当有错误产生时 *.err 日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行 slave start
重起 AB 机器,则可以实现双向的热备。
对于故障诊断,我的方法是都在在slave上.那么slave上是如何工作的呢?
Slave上Mysql的Replication工作有两个线程,I/O thread和SQL thread,I/O 的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待slave更新),然后写到 本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的东西,于是同步就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var/lib/mysql/relay-log.info.
请注意,因为上边提到了binlog里的内容是改了什么东东,而不是改了以后是什么东东,所 以在进行同步之前必须保证两个数据库是完全相同的,不然可能出错.打个比方来说.A机上有一个表里的元组为2,而操作是减一,则binlog只会记录减一 这个操作,如果B机上没有,那么则无法得到同步,因为B机没有这个字段,就不知道减一是什么操作.
对于故障诊断,我的方法是都在slave(master/slave是相对的)的 mysql(指客户端)里完成.
方法一:show slave status;
正确情况下应该同如下类似:
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是两台机器的主机名,所以真实情况应该有所分别,注意其 中的YES|YES,这个是本地I/O线程及SQL线程的工作状态,要确
保都为YES,如果不是YES,请检查mysql是否正常运行.
方法二:show processlist;
如果正确,则应该如下所示:
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)
注意同标记过的字符类似,则是正确的,错误情况下应该是这个样子:
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)
当然如果这里的Reconnecting只是错误的一种,有可能是connecting,则 表示正在连接,那么请检查:
1 master上的mysql daemon是否正常运行
2 master与slave的网络连接是否正常
3 my.cnf是否配置正确
4 在修改配置后是否删除过master.info?(删掉以后会自动再生成一个,别担心删掉),因为如果不删掉的话,那么则还是使用原来的配置
5 修改配置后有没有重新启动mysql daemon,重新启动过程后必须证实mysql已经正常启动
6 master上给slave及slave给master上分配的replication用户权限是否正确,master的主机名和dns设置
7 当前状况两台数据库是否完全相同.
方法三: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则表示有问题,请检查/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上不是这样,那么就应该是master的配置有问题啦.
方法四 查看错误日志
在 /usr/local/mysql/var下有个 localhost.err 文件,所有的错误都在其中被记录
ps:
至于多机热备怎么做?
我G和B了网上教程说到“将几台mysql服务器像首尾 相连的蛇,组成一个环装,就可以了,而且还可以作几个单向的更新,用以分担select这样的读取操作的压力” 具体偶也没做过,不太清楚。有网友有成功案例的请分享。