搞定MySQL双机备份
为了数据的安全,客户有两台机器作为互相备份,当一台机器出现故障时,自动切换到另外一台服务器。大部分的软件我们是通过LifeKeeper来实现的,但是MySQL的双机备份在LifeKeeper里没有实现,看来,只有我手动来实现MySQL的双机备份了哦。
先说说环境
QUOTE:
操作系统:windows 2003 server
MySQL版本:v4.1
互备数据库:bbs
Server1:10.2.2.3
Server2:10.2.2.4
其实,MySQL的双机备份有一个很简单的第三方软件可以实现,那就是SQLyog (http://www.webyog.com/),他有一个功能叫sja(SQLyog Job Agent ,http://www.webyog.com/sqlyog/sja.html),可以轻松实现,但是却有一个不足,那就是MySQL表里必须有一个primary key,如果没有,则此表不能用sja来实现。我查看了一下,我们需要互备的数据中就有两三个表没有primary key,看来要放弃这个方法了。
第二种方法就是用MySQL自身的Replication机制来实现了。据说MySQL 3.23以上的版本都有此功能。下面来说说具体的步骤。
1)先在每台服务器上各安装好mysql,保证正常运行,在Mysql的安装目录里各建立一个目录logs,如F:\Mysql4.1\logs,供后面步骤使用。
2)将要互备的初始化数据在每台服务器上各导入一份,且保持两台服务器要互备的初始化数据一致。这个步骤很重要。
3)在每个server上各增加一个备份用户,且赋予一定的权限。
3.1)在Server1上
QUOTE:
GRANT
REPLICATION SLAVE,RELOAD,SUPER ON *.* TO [email protected]‘10.2.2.4‘ IDENTIFIED BY
‘123456‘;
之后立即在Server2上用如下命令来测试backup用户是否能连接上Server1
QUOTE:
F:\Mysql4.1\bin\mysql.exe
-h10.2.2.3 -ubackup -p123456
如果能连接上,表明互备帐户增加OK!
3.2)重复上述动作,在Server2上
QUOTE:
GRANT
REPLICATION SLAVE,RELOAD,SUPER ON *.* TO [email protected]‘10.2.2.3‘ IDENTIFIED BY
‘123456‘;
之后立即在Server1上用如下命令来测试backup用户是否能连接上Server2
QUOTE:
F:\Mysql4.1\bin\mysql.exe
-h10.2.2.4 -ubackup -p123456
如果能连接上,表明互备帐户增加OK!
4)修改mysql配置文件,增加互备参数配置。
4.1)停掉server1的mysql,修改my.ini,在[mysqld]区域内增加如下信息:
QUOTE:
#####################################################
#MySQL的双机备份,by
longware,2006-05-26
server-id=1
log-bin=F:/MySQL4.1/logs/sync
master-host=10.2.2.4
master-user=backup
master-password=123456
master-port=3306
master-connect-retry=60
replicate-do-db=bbs
#####################################################
保存并关闭my.ini文件,重启mysql服务,观察logs目录下面有没有类似sync.000001、sync.index的文件生成,观察data目录里有没有*.info、*-relay-bin.000001、*-relay-bin.index的文件生成,如果两个目录都有,说明互备参数配置正确。
4.2)停掉server2的mysql,修改my.ini,在[mysqld]区域内增加如下信息:
QUOTE:
#####################################################
#MySQL的双机备份,by
longware,2006-05-26
server-id=2
log-bin=F:/MySQL4.1/logs/sync
master-host=10.2.2.3
master-user=backup
master-password=123456
master-port=3306
master-connect-retry=60
replicate-do-db=bbs
#####################################################
保存并关闭my.ini文件,重启mysql服务,观察logs目录下面有没有类似sync.000001、sync.index的文件生成,观察data目录里有没有*.info、*-relay-bin.000001、*-relay-bin.index的文件生成,如果两个目录都有,说明互备参数配置正确。
4.3)如果没有看到上步中说的文件,说明配置文件没有起作用,请检查mysql配置文件的位置,很可能在c:\windows\下面,也可能在C:\Documents and Settings\Administrator\windows下面,还可能在F:\Mysql4.1\下面,具体要看您的mysql服务的启动参数,您可以去windows的“开始-控制面板-管理工具-服务”中,双击mysql的服务名称,查看”可执行文件的路径“项的值,如果是
QUOTE:
F:/mysql4.1/bin/mysqld-nt.exe
则my.ini可能就在c:\windows\下面,如果是
QUOTE:
"F:\MySQL4.1\bin\mysqld-nt"
--defaults-file="F:\MySQL4.1\my.ini" MySQL
则my.ini就在F:\MySQL4.1下面。我的一个朋友就因为没有搞清楚my.ini的位置,折腾了大半天也每搞定。
5)分别停掉两台机器的mysql服务,再次确保两台机器的要互备的初始化数据一致,删除logs下面的文件,删除data下面的非目录文件,确保网络畅通,再分别启动server1和server2的mysql服务,mysql双机互备成功了。
6)互备测试,在server1里的bbs数据库里建一张表,插几条数据,再登陆到server2里,看看数据是否存在,存在表明OK。
7)注意:两台机器的mysql互备的初始化数据要相同。如果要单向备份,将其中的一台服务器的my.ini的互备配置注释掉重启即可。
8)官方参考资料:
http://dev.mysql.com/doc/refman/5.1/en/ndbcluster.html
http://dev.mysql.com/doc/refman/ ...
er-replication.html
日志抓取和数据载入(REPLICATION SLAVE,
REPLICATION CLIENT
)
MySQL手册版本 5.0.20-MySQL同步(二) |
||||||||
发布于:2006-8-15 17:10:51 已被阅读: 247 |
||||||||
6.4 设置同步 以下描述了如何快速设置MySQL同步服务器。假设你打算同步全部的数据库,并且之前没有设置过。需要关闭master服务器以完成全部的步骤。 本章描述的过程可以用于一个slave的情况,也可以用于多个slave的情况。 这只是一个最直接设置slave的办法,并不是只有一个。例如,已经有了master的数据快照(snapshot),master已经设置了服务器编号ID(server_id)并且启用了二进制日志,这就无需关闭master或者阻止在master上更新数据了。详情请看"6.9 Replication FAQ"。 想要完全掌握MySQL同步设置,最好把本章全部读完,并且测试在"14.6.1 SQL Statements for 注意,这个过程以及后面一些同步SQL语句需要有 SUPER 权限。MySQL 4.0.2以前,则是 PROCESS 权限。 请确认master和slave上都安装了较近的MySQL版本,且这些版本之间要能兼容,在"6.5 Replication 在master上新加一个帐户,slave才能用它来连接。这个帐户必须授予 REPLICATION SLAVE 权限。如果这个帐户只用于同步(推荐这么做),那就没必要授予其他权限了。设定你的域是 mydomain.com,想要授权一个帐户 repl 使用密码 slavepass,允许它可以在域里的任何主机连接到master上。用 GRANT 语句来创建帐户: mysql> -> TO 在MySQL 4.0.2以前,用 FILE 权限来代替 REPLICATION SLAVE: mysql> -> TO 如果打算在slave上执行 LOAD TABLE FROM MASTER 或 LOAD DATA FROM MASTER 语句,那么必须给该帐户授予附加权限: 授予全局 SUPER 和 RELOAD 权限。 授予对想要加载的所有表上的 SELECT 权限。在master上任何没有 SELECT 权限的表都会被 LOAD DATA FROM MASTER 略过。 如果只用到 MyISAM 表,执行 FLUSH TABLES WITH READ LOCK 语句刷新所有表并且阻止其他写入: mysql> 不要退出执行 FLUSH TABLES 语句的客户端,以保持读锁有效(如果退出了,读锁就释放了)。然后从master上取得数据快照。比较简单的办法就是把数据目录打包压缩。例如,Unix上的 tar, PowerArchiver, WinRAR, WinZip,或Windows上的类似程序。想要用 tar 来创建一个压缩包,包括所有的数据库,只需执行以下命令(把目录改成你的真实路径): shell> 如果只想打包一个数据库 this_db,只需执行命令: shell> 然后把这个文件拷贝到slave的 `/tmp` 目录下。在slave上,执行以下命令解开压缩包(把目录改成你的真实路径): shell> 可能不需要同步 mysql 数据库,因为在slave上的权限表和master不一样。这时,解开压缩包的时候要排除它。同时在压缩包中也不要包含任何日志文件,或者 `master.info~ 或 `relay-log.info` 文件。当在master上的 FLUSH TABLES WITH READ LOCK 语句还生效时,在master上读取当前二进制文件的文件名及偏移位置: mysql > +---------------+----------+--------------+------------------+ | File | +---------------+----------+--------------+------------------+ | +---------------+----------+--------------+------------------+ File 字段显示了二进制日志文件名,Position 字段显示了日志偏移位置。在这个例子中,日志文件是 mysql-bin.003,偏移位置是 73。记下这些值,在后面设置slave的时候就需要用到它们了。它们表示了slave要从master的哪个偏移位置开始处理更新操作。取得快照和记录下日志名及偏移位置后,就可以让master释放读锁了: mysql> 如果用到 InnoDB 表,那么最好使用 InnoDB Hot Backup 工具。它无需在master上请求任何锁就能做到快照的一致性,并且在后面中在slave上要用到的快照中已经记录了日志文件名以及偏移位置。InnoDB Hot Backup 是费免费(商业的)的附加工具,它没有包含在MySQL发布包中。访问 InnoDB Hot Backup 的主页 mysql> mysql> 尽快记下 SHOW MASTER STATUS 显示结果中的日志文件及偏移位置。然后,在不解锁的情况下关闭master,确保master上的快照和记录的结果一致: shell> 还有一个方法可以同时用于 MyISAM 和 InnoDB 表,这就是在master上作SQL转储而无需如上所述备份二进制日志。在master上运行 mysqldump --master-data 命令,然后把结果文件转储到slave上。不过,这比拷贝二进制日志慢点。如果master在以前没有启用 --log-bin 选项,那么执行 SHOW MASTER STATUS 语句的结果中的文件名及偏移位置值为空了,那么后面在slave上指定的参数值就是空字符串(‘‘) 和 4了。 确认master上的 `my.cnf` 文件 [mysqld] 区间有 log-bin 选项。这个区间还必须有 server-id=master_id 选项,的值必须是 1 到 2^32-1 之间的正整数。例如: [mysqld] log-bin server-id=1 如果这些配置选项不存在,那么就加上并且重启master。 关闭要做slave的服务器,在 `my.cnf` 文件中增加如下选项: [mysqld] server-id=slave_id slave_id 的值和 master_id 类似,是 1 到 2^32-1 之间的正整数。另外,这个ID必须不能和master的ID一样。例如: [mysqld] server-id=2 如果有多个slave,那么每个slave都必须要有一个唯一的 server-id,它的值不能和master以及其其他slave的值一样。可以把 server-id 想象成为IP地址:这些ID标识了整个同步组合中的每个服务器。如果没有指定 server-id 的值,如果也没定义 master-host,那么它的值就为1,否则为2。注意,如果没有设定 server-id,那么master就会拒绝所有的slave连接,同时slave也会拒绝连接到master上。因此,省略配置 server-id 只对备份二进制日志有利。 如果已经备份了master上的数据(直接打包压缩的方式),那么在slave启动之前把它们拷贝过去。要确保文件的权限属主等设置没问题。MySQL运行的用户必须对这些文件有读写权限,就跟在master上一样。如果是用 mysqldump 备份的,那么可以直接启动salve(直接跳到下一步)。 启动slave,如果它之前已经运行同步了,那么在启动slave的时候使用 --skip-slave-start 选项使之不会立刻去连接master。最好也使用 --log-warnings 选项(从 MySQL 4.0.19 和 4.1.2 开始就是默认启用了)来启动slave,以知道发生问题时的更详细的信息(例如,网络或者连接问题)。从开始MySQL 4.0.21 和 4.1.3,异常中止的连接不再记录到错误日志中,除非 --log-warnings 选项的值大于1。 如果在master上用 mysqldump 备份数据的话,把文件导入slave中: shell> 在slave上执行如下语句,把各个选项的值替换成真实值: mysql> -> -> -> -> -> 下表列出了各个选项字符串的最大长度:
启动slave线程: mysql> 做完上述过程后,slave应该会连接到master上并且捕获所有从取得快照后的更新操作。 如果忘了设置master的 server-id 值,那么slave就不能连接到master上。 如果忘了设置master的 server-id 值,那么在错误日志中就会记录如下内容: Warning: we force 如果因为其他原因不能同步的话,错误信息也会记录在slave的日志上。 一旦slave开始同步了,就能在数据文件目录下找到2个文件 `master.info` 和`relay-log.info`。slave利用这2个文件来跟踪处理了多少master的二进制日志。 不要删除或者修改这2个文件,除非知道怎么改。尽管如此,我们更推荐用 CHANGE MASTER TO 语句来做。 注意:`master.info` 中的内容覆盖了部分命令行中指定的或 `my.cnf` 的选项。详情请看"6.8 Replication Startup 只要有了master的数据快照,就可以按照上述几个步骤配置其它slave了。无需再次取得master的数据快照,每个slave都可以用这一份快照来做。 |
原文地址:https://www.cnblogs.com/sfqas/p/12181893.html