免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1482 | 回复: 0
打印 上一主题 下一主题

mysql双机实时备份(已成功进行库备份) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-30 11:46 |只看该作者 |倒序浏览
在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这样的读取操作的压力” 具体偶也没做过,不太清楚。有网友有成功案例的请分享。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16615/showart_92753.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP