Chinaunix首页 | 论坛 | 博客
  • 博客访问: 406257
  • 博文数量: 54
  • 博客积分: 2225
  • 博客等级: 大尉
  • 技术积分: 547
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-23 09:58
文章分类

全部博文(54)

文章存档

2014年(1)

2012年(1)

2011年(33)

2010年(6)

2009年(13)

分类: Mysql/postgreSQL

2011-09-09 18:14:06

2008年12月10日 星期三 10:36

####原理########

mysql 的数据同步,在 mysql 官方网站文档上,叫 replication 字面是重作的意思,意译就是同步了。

mysql 为了实现 replication 必须打开 bin-log 项,也是打开二进制的 mysql 日志记录选项。
mysql 的 bin log 二进制日志,可以记录所有影响到数据库表中存储记录内容的 sql 操作,如 insert / update / delete 操作,而不记录 select 这样的操作。因此,我们可以通过二进制日志把某一时间段内丢失的数据可以恢复到数据库中,( 如果二进制日志中记录的日志项,包涵数据库表中所有数据,那么,就可以恢复本地数据库的全部数据了 )
而这个二进制日志,如果用作远程数据库恢复,那就是 replication 了。
这就是使用 replication 而不用 sync 的原因。
这也是为什么要设置 bin-log = 这个选项的原因。
在同步过程中,最重要的同步参照物,就是同步使用那一个二进制日志文件,从那一条记录开始同步。
下面的官方文档,说明如何安装与设置 mysql 同步操作,当然,英文版
http://dev.mysql.com/doc/mysql/en/Replication_HOWTO.html
以下是中文翻译:

 1. 首先,你应该有两个或两个以上的 mysql 数据库服务器,版本最好是在 3.3 以上 ( 当然啦,两个服务器不一定是两台机器,一台机器上安装两个 mysql 服务是可以的,同时,如果你对 mysql replication 原理十分精通的话,你甚至可以在一个 mysql 服务的两个不同数据库 database 之间作同步,看有没有需要了) 
说明: 这两个服务器一般设置一个为 主服务器,或叫源服务器, master mysql server, 另一台或其他多台就是 replication slave 同步从服务器了。一台 slave 与多台 slave 设置方法是一样的,这样你就可以作类似数据库集群了

2. 设置可访问 mysql 帐号,操作以英文为准
说明:
2.1 mysql 帐号一般设置为限定 ip 访问,以保障安全性
2.2 mysql 帐号一般在 master 与 slave 设置为相同帐号,同时是远程可访问
2.3 特别注意,如果你用 linux / unix 操作系统,那一定要注意一下防火墙 firewall 有没有限制 mysql 远程访问,如果是,最好是打开远程访问端口,并作好访问 ip 限制
2.4 由于 my.cnf 中要明文存储 mysql 帐号密码,请注意保护 my.cnf 不让其他用户访问到( 看来要向 mysql 说明下以后用密码存 passwd )

3. 第三步,当然是设置两个服务器要同步的数据库为同样的数据库了
这里有一些技巧,包括 mysql 的 sql 指令说明下
3.1 方法之一,就是英文说明中说的,先锁定数据库读写功能 ( 其实最好是停止 mysqld 服务,再作备份) 然后用 tar 备份数据库目录,转到 slave 服务器相同数据目录中   
3.2 方法之二,使用 mysql studio 这样的实用工具,直接使用 mysql studio 的 backup database 工具把数据库同步   
3.3 以上两种方法都是 master 数据库中有不少数据记录,按上两 种方法得到 master 与 slave 有相同数据库与数据记录。 而第三种方法,则是适合于新建数据库的情况,特别适合于 master 与 slave 在 my.cnf 已经设置好 replication 关系 (但 未指定 database 同步数据库 ) 的情况: 这就是使用 mysql 的 sql 语句 load table from master 与 load data from master;
load table from master 可以从 master 数据库把表结构复制到 slave 数据库中,这样可以建立同步的表。
load data from master 是从 master 数据库把数据导入到 slave 数据表中,条件是 master 从一开始安装运行就使用了 bin-log参数而保存有二进制日志

   技巧: 如果你使用 win2k 的 mysql 那么,你可以下载 mysql.com 出的官方 mysql administrator 实用程序,直接在 mysql administrator 中即可配置 master 与 slave ,同时也可以配置 query-cache 哟

在 master 的 my.cnf ( 如果是 win32 那就是 my.ini ) 增加
[mysqld]
log-bin=database_bin_log
#记录日志的数据库
binlog-do-db=database
#binlog-ignore-db=db_name //不记录日志的数据库
server-id=1   
注意,上面的 log-bin = 中的 等号 = 是不可少的

  在 slave 的 my.cnf 修改
[mysqld]
server-id=2 # 如果有多个 slave 就改为不重复的 id 就好,在mysql 4.1 中,这个已经取消了
master-host=10.10.10.22
master-user=backup #同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60 #预设重试间隔60秒
replicate-do-db=test # 告诉slave只做 test 数据库的更新
bin-log = database_bin_log
5. 检查 master 与 slave 配置状态,使用 show master status; 与 show slave status; 这两个 SQL 指令即可在 master 与 slave 查看配置状态。这里有两个状态变量十分重要

  mysql > SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73  | test   | manual,mysql  |
+—————+———-+————–+——————+

注意 File 是 mysql-bin.003 而 position 是 73
这个文件是对 test 这个 数据库的二进制日志记录,记录数据变化的当前记录条数是 73
前面我们说过,二进制日志记录着某个数据库所有数据记录变化的 sql 操作语句,如 insert / update / delete 等,正是因为如此,在 slave 同步 mysql 数据库操作时,其实是读取master 中这个 mysql-bin.003 二进制日志中的 sql 操作,同在 slave 中执行这些 sql 操作,所以,同步成功有以下几个条件
1. master 与 slave 有相同的数据库表结构,最好 database name 也一样 ( 可以设置为不一样的 database name)
2. master 与 slave 有相同的初始数据记录,保证同步操作开始后两者数据一致
3. master 必须使用 bin-log 二进制日志记录 ( 推荐 slave 也使用 bin-log )
4. slave 是从 master 的 bin-log 是读取 sql 记录来同步,所以,从哪一条 log 开始读取很重要 ( 下面的第 7 条操作,就是保证 slave 能与 master 保持相同的记录读取,并读取正确的 bin-log 日志文件 )

7:在 slave 执行下面 sql 操作 (使主从数据同步,slave从master的点开始同步)

mysql> CHANGE MASTER TO
->  MASTER_HOST=’master_host_name’,
->  MASTER_USER=’replication_user_name’,
->  MASTER_PASSWORD=’replication_password’,
->  MASTER_LOG_FILE=’recorded_log_file_name’,
->  MASTER_LOG_POS=recorded_log_position;

这里,把 上面的 redcorded_log_file_name 改为 mysql-bin.003 而 recorded_log_position 改为 73 (特别注意哟,这是关系关键)
##################################

配置文件:

master:

#日志文件的名称,这里可以制定日志到别的目录 如果没有设置则默认主机名的一个日志名称
log-bin=myfk_bin_log
#记录日志的数据库
binlog-do-db=myfookoo
#binlog-ignore-db=db_name //不记录日志的数据库
max_binlog_size = 104857600 #日志的大小,超出会自动生成一个新的

slave:

log-bin=mysql-bin
server-id=2
master-host=172.17.10.19
master-user=slave
master-password=fookoo_MS
master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差
replicate-do-db=myfookoo #备份的数据库


阅读(9095) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~