mysql双机实时备份

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这样的读取操作的压力” 具体偶也没做过,不太清楚。有网友有成功案例的请分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值