Chinaunix首页 | 论坛 | 博客

  • 博客访问: 916117
  • 博文数量: 226
  • 博客积分: 10077
  • 博客等级: 上将
  • 技术积分: 2708
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 14:36
文章分类

全部博文(226)

文章存档

2010年(15)

2009年(82)

2008年(129)

我的朋友

分类: LINUX

2009-09-28 09:50:19

1. 设置主数据库
       修改[mysqld]里边的键值增加
       server-id=1
       log-bin=%日志记录文件名(并不是完整的文件名,实际生成的日志文件名以该名作为前缀,注意符号“.”不能用)%
       log-slave-updates :注意该选项不打开,同步的sql将不会写入bin-log日志。

2. 主数据库增加用于获取同步日志的用户replicuser,并赋予权限replication slave,Select, reload,super(后面三个权限不是必须的)
        grant replication slave,Select, reload,super on *.* to ’replicuser’@’192.168.0.206’ identified by ’replicuser’
        在从库测试该用户是否可以连接mysql -u replication -p -h 192.168.0.205 -P5699,如果可以连接表示该用户已经可以连接主库(注意可能主机名不可用,最好用IP)

3. 获得主库当前的日志文件和偏移      (如果mysql没有记录日志,则用命令SET SQL_LOG_BIN = 1可以启用,反之用SET SQL_LOG_BIN = 0停用)
       mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73  | test   | manual,mysql  |
+---------------+----------+--------------+------------------+    

4. 在保证主库不变的情况下,可以直接把主库的库文件拷贝至从库,如果有innodb表,还需要把表空间文件(ibdata...)文件拷贝过去(保证当前主从库的数据一致)。

5. 停从库,修改从库my.cnf
[mysqld] 
server-id=2
master-host=192.168.0.205 (可能使用主机名不起作用)
master-port = 5678
master-user=replicuser
master-password=replicuser

6. 启动从库,查看是否连接上主控(看从库的错误日志hostname.err)。
可以在运行中配置主库,使用命令:
mysql> show slave status; (查看从库连接的主库)
mysql> STOP SLAVE; 
mysql> CHANGE MASTER TO
   ->  MASTER_HOST='master_host_name',
->  MASTER_PORT=5678,
   ->  MASTER_USER='replication_user_name',
   ->  MASTER_PASSWORD='replication_password',
   ->  MASTER_LOG_FILE='recorded_log_file_name', (主机日志的文件名)
   ->  MASTER_LOG_POS=recorded_log_position; (开始执行备份日志的位置)
mysql> START SLAVE;

7. 测试主从同步是否已经起作用。



下列所述启动选项都是用来控制同步的:它们中的大部分都可以在运行时用 CHANGE MASTER TO 语句来改变。
其他的,例如 --replicate-*,只能在salve启动时指定
--log-slave-updates

通常,slave从master接收更新操作后并没有再把它们记录在二进制日志中。这个选项告诉slave的SQL线程要把这些更新操作记录在二进制日志中。想要这个选项起作用,需要同时启用 --log-bin 选项才能启用二进制日志。在使用同步链机制时,就需要使用 --log-slave-updates 选项。例如,可能需要设置如下同步关系:
A -> B -> C

在这里,A当作B的master,B当作C的master。B同时是slave又是master,在A和B上都需要启用 --log-bin 选项,并且在B上还需要启用 --log-slave-updates 选项。

--log-warnings
让slave在执行同步时记录更多的错误日志。例如,它会通知你在网络/连接失败后重连成功,并且通知了每个slave线程如何启动的。这个选项在MySQL 4.0.19和4.1.12之后默认启用了;用 --skip-log-warnings 就可以禁用它。从MySQL 4.0.21和MySQL 4.1.3开始,除非这个选项的值大于1,否则放弃的连接不再记录在错误日志中。这个选项不只是用于限制同步,它产生的警告跨越了大部分操作。
--master-connect-retry=seconds
在master当机或者网络连接中断后,slave在重新连接到master之前休眠的秒数。如果在 `master.info` 文件中存在,就优先使用它。如果没有设置,默认是60。
--master-host=host
master服务器的主机名或者ip地址。如果没有设置它,slave线程无法启动。如果存在的话,`master.info` 文件中选项值优先被读取。
--master-info-file=file_name
slave记录master信息的文件名。默认名字是 `master.info`,放在数据文件目录下。
--master-password=password
用于被授权连接到master上运行同步的帐户密码。如果存在的话,`master.info` 文件中选项值优先被读取。如果没有设置,就当作是空密码。
--master-port=port_number
master上监听的TCP/IP端口号。如果存在的话,`master.info` 文件中选项值优先被读取。如果没有设置,就当作预编译的设置。如果没有修改 configure 选项参数,那么就是3306。
--master-ssl,--master-ssl-ca=file_name,--master-ssl-capath=directory_name,
--master-ssl-cert=file_name,--master-ssl-cipher=cipher_list,--master-ssl-key=file_name
用于设定用SSL安全连接到master的选项。它们的意义对应于""中提到的 --ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key 选项。如果存在的话,`master.info` 文件中选项值优先被读取。这些选项是从MySQL 4.1.1之后开始可以用的。
--master-user=username
用于被授权连接到master上运行同步的帐户。这个帐户必须有 REPLICATION SLAVE 权限(在MySQL 4.0.2以前,则是 FILE 权限)。如果存在的话,`master.info` 文件中选项值优先被读取。如果没有设置,就当作是 test
--max-relay-log-size=#
中继日志自动轮转(rotate)的大小。详情请看""。这个选项是从MySQL 4.0.14之后才可以用的。
--read-only
这个选项令slave除了slave线程或者拥有 SUPER 权限用户之外的都不能更新数据。这能确保slave不会接受来自其他客户端的更新。这个选项是从MySQL 4.0.14开始有的。
--relay-log=file_name
中继日志的名字。默认名字是 host_name-relay-bin.nnnhost_name 是slave服务器的主机名,nnn 是指中继日志的顺序号。可以用这个选项创建不依赖主机名的中继日志,或者在中继日志越来越大(不想降低 max_relay_log_size 的值)且需要将它们放在非数据文件目录下,或者想使用磁盘间的负载均衡来提高速度等情况。
--relay-log-index=file_name
中继日志索引文件的位置及文件名。它的默认值是 host_name-relay-bin.indexhost_name 是slave服务器主机名。
--relay-log-info-file=file_name
slave上记录中继日志信息的文件名。默认是数据文件目录下的`relay-log.info`
--relay-log-purge={0|1}
在不需要中继日志时禁用或启用自动清除。默认值是1(启用)。这是一个全局变量,可以用 SET GLOBAL relay_log_purge 来动态更改。这个选项从MySQL 4.1.1开始可以用。
--relay-log-space-limit=#
用于加大slave上中继日志的总大小(如果值为0表示"无限")。这在slave主机只有有限的空间时很有用。当达到这个限制 后,I/O线程直到SQL线程删除一些无用的中继日志后才会继续从master读取二进制日志事件。注意,这个限制不是绝对的:在删除中继日志之 前,SQL线程可能还需要更多的二进制日志事件。这种情况下,I/O线程会超越这个限制,直到SQL线程删除一些中继日志,因为如果不这么做的话就会导致 死锁(在MySQL 4.0.13之前就是这样)。不要设置 --relay-log-space-limit 的值小于2倍 --max-relay-log-size (如果 --max-relay-log-size 的值为0,则是 --max-binlog-size ) 的值。在这种情况下,由于已经超过 --relay-log-space-limit 了,I/O线程需要等待更多的剩余空间,但是SQL线程没有可以删除的中继日志来满足I/O线程的需求。这就会强制I/O线程暂时忽略 --relay-log-space-limit 限制。
--replicate-do-db=db_name
告诉slave只同步那些缺省数据库是 db_name (也就是用 USE 选中的)的语句。想要指定更多的数据库,只需多次使用该选项,每次指定一个数据库。注意,类似 UPDATE some_db.some_table SET foo='bar' 这样的跨库操作语句以及没有选中数据库的操作都不会被同步。如果必须使用跨库操作,要确保使用MySQL 3.23.28或更高,并且使用 --replicate-wild-do-table=db_name.% 选项。请仔细阅读最后面的注意事项。
下面是一个不能按照预期工作的例子:如果启动slave时使用 --replicate-do-db=sales 选项,并且在master上执行下列语句,那么这个 UPDATE 语句不会被同步:
USE prices;
UPDATE sales.january SET amount=amount+1000;

如果需要同步跨库操作,只需使用 --replicate-wild-do-table=db_name.% 选项。这个"只检查缺省数据库"特性的主要原因是因为想要单从一个语句中判断是否要被同步比较困难(例如,使用多表 DELETE 或者 UPDATE,这就跨库了)。不过想要检查是否是缺省数据库却很快。

--replicate-do-table=db_name.tbl_name
告诉slave只同步那些指定的数据表。想要指定更多的数据表,只需多次使用该选项,每次指定一个数据表。这个选项支持跨库更新,和 --replicate-do-db 选项相反。请仔细阅读最后面的注意事项。
--replicate-ignore-db=db_name
告诉slave不要同步那些缺省数据库是 db_name (也就是用 USE 选中的)的语句。想要指定更多的数据库,只需多次使用该选项,每次指定一个数据库。如果有跨库操作且希望这些操作要被同步就不要使用该选项。请仔细阅读最后面的注意事项。
下面是一个不能按照预期工作的例子:如果启动slave时使用 --replicate-ignore-db=sales 选项,并且在master上执行下列语句,那么这个 UPDATE 语句不会被同步:
USE prices;
UPDATE sales.january SET amount=amount+1000;

想要让跨库操作能正常同步,只需使用 --replicate-wild-ignore-table=db_name.% 选项。

--replicate-ignore-table=db_name.tbl_name
告诉slave不要同步指定数据表的任何更新语句(甚至用同一个语句更新的其他表)。想要指定更多的数据表,只需多次使用该选项,每次指定一个数据表。这个选项支持跨库更新,和 --replicate-ignore-db 选项相反。请仔细阅读最后面的注意事项。
--replicate-wild-do-table=db_name.tbl_name
限制slave只同步那些匹配指定模式的数据表。模式中可以包含通配符 `%` 和 `_`,它们的含义和 LIKE 模式一样。想要指定更多的数据表,只需多次使用该选项,每次指定一个数据表。请仔细阅读最后面的注意事项。
例如: --replicate-wild-do-table=foo%.bar% 会同步所有以 foo 开头的数据库下的以 bar 开头的数据表上的更新操作。
如果匹配模式是 %,则匹配所有的表名,且应用到数据库级语句(CREATE DATABASE, DROP DATABASE,和 ALTER DATABASE)。例如,使用 --replicate-wild-do-table=foo%.% 选项的话,所有匹配 foo% 模式的数据库级操作都会被同步。
如果想要在数据库/表模式中包含原义通配符,需要用反斜杠来转义它们。例如,想要同步 my_own%db 数据库下的所有表,但是不想同步 my1ownAABCdb 数据库下的表,就需要转义字符 `_`: --replicate-wild-do-table=my\_own\%db。如果是在命令行中使用这个选项,就可能需要两个反斜杠来转义,这依赖于命令行解释器。例如,在 bash shell下,就需要输入: --replicate-wild-do-table=my\\_own\\%db
--replicate-wild-ignore-table=db_name.tbl_name
限制slave不同步那些匹配指定模式的数据表。想要指定更多的数据表,只需多次使用该选项,每次指定一个数据表。请仔细阅读最后面的注意事项。
例如,--replicate-wild-ignore-table=foo%.bar% 就不会同步所有以 foo 开头的数据库下的以 bar 开头的数据表上的更新操作。
想要了解匹配模式如何工作的,请查看 --replicate-wild-ignore-table 选项的具体描述。模式中包含原义通配符的规则和 --replicate-wild-ignore-table 选项一样。
--replicate-rewrite-db=from_name->to_name
告诉slave把在master上的缺省数据库 from_name (只有用 USE 选中的)转换成 to_name 。只有涉及到数据表的语句(不包括类似 CREATE DATABASE, DROP DATABASE,和 ALTER DATABASE)才会被同步,并且只针对master上缺省数据库为 from_name 的情况。这个选项不支持跨库操作。注意,数据库名字转换先于 --replicate-* 规则之前测试。如果是在命令行中使用这个选项,需要把 `>' 字符用引号引用起来。例如:
shell> mysqld --replicate-rewrite-db="olddb->newdb"

--replicate-same-server-id
该选项用于slave之上。通常使用它的默认值0,用于避免无限同步循环。如果设置为1,那么slave就不会忽略那些跟它有同样服务器编号的更新日志了;通常它只用于比较罕见的配置中。如果启用 --log-slave-updates 选项,则不能设置为1。注意,从MySQL 4.1开始,slave的I/O线程默认不把包含slave的服务器编号的二进制日志写到中继日志中(相对4.0这能节省磁盘使用)。因此想要在4.1中使用 --replicate-same-server-id 选项,在slave读取自己的更新事件让SQL线程来执行之前要确保启动slave时使用该选项。

--report-host=host
在salve注册时要报告的master主机名或IP地址。在master上执行 SHOW SLAVE HOSTS 语句时就会显示出来了。如果不想slave注册到master就无需设置这个选项。注意,这在slave连接到master之后,只根据这个配置master还不能直接从TCP/IP套接字中读取slave的IP地址。因为存在 NAT 或者其他路由机制,这个IP信息还不足以在master或者其他主机上连接到slave上。这个选项是从MySQL 4.0.0开始可以用的。

--report-port=port_number
连 接到slave的TCP/IP端口,在slave注册到master时用的到。除非slave在非默认端口上监听或者从master或其他客户端上到连接 到slave使用的是特定的隧道,否则无需设置这个值。如果不确定,就不要设置它。这个选项是从MySQL 4.0.0开始可以用的。

--skip-slave-start
告诉slave服务器在启动时不要运行slave线程。只需使用 START SLAVE 语句来启动slave线程。

--slave_compressed_protocol={0|1}
如果它设置为1,并且maste/slave都支持的话,就采用压缩协议传输数据。

--slave-load-tmpdir=file_name
slave创建临时文件的目录。这个选项值默认地和系统变量 tmpdir 的值一样。slave的SQL线程同步 LOAD DATA INFILE 语句时,它从中继日志中提取出要被加载的文件放到临时文件中,然后把它们加载到slave中。如果在master上加载的文件很大,那么slave上的临时文件也会很大。因此建议在slave上指定这个选项时把它放在剩余空间比较多的文件系统上。这是,最好也指定 --relay-log 到那个文件系统中,因为中继日志可能也会很大。--slave-load-tmpdir 必须指向基于磁盘的文件系统,而不能是基于内存的文件系统:slave可能会在机器重启后同步 LOAD DATA INFILE 语句时需要用到这个临时文件。这个目录同样不能在会被操作系统的启动进程清除的目录下。

--slave-net-timeout=seconds
salve放弃读之后等待多少秒再次从master读取更多的数据,考虑到了连接断开,尝试重连的情况。第一次重试会在超时后立刻执行。重试的时间间隔由选项 --master-connect-retry 控制。

--slave-skip-errors= [err_code1,err_code2,... | all]
通常,发生错误时同步就会停止,以提供手工解决数据不一致的情况。这个选项告诉slave的SQL线程当执行语句时返回的错误代码在该列表中时继续运行。
除 非真正的理解了为什么会产生相应的错误后,否则不要设置这个选项。如果同步设置以及客户端程序都没有bug,并且也不是MySQL自 身的bug的话,那么就不会出现让同步停止的错误了。不加区分地使用这个选项,会导致slave无可救药地背离master的同步,并且你也不知道这是为 什么。
可以在从slave的错误日志并且在slave上执行 SHOW SLAVE STATUS 语句的结果中就能看到错误代码了。服务器错误代码详情请看""。
你也可以(最好不要)使用非常不推荐使用的值 all,它能忽略所有的错误信息,不管什么情况都继续保持同步。不消说,如果使用这个选项值,就不可能期待有数据的完整性了。这种情况下,就不能抱怨slave的数据无论在哪个地方都和master不接近了。已经警告过你了。例如:

--slave-skip-errors=1062,1053
--slave-skip-errors=all

--replicate-* 模式根据以下规则来决定一个语句是要执行还是被忽略:


  1. 是否有 --replicate-do-db--replicate-ignore-db 规则?

    • 是:测试 --binlog-do-db--binlog-ignore-db 选项(详情请看"")。测试结果?
      • 忽略:忽略并且退出。
      • 执行:不立刻执行,推迟判断,到下一步。
    • 否:到下一步。
  2. 是否有 --replicate-*-table 规则?


    • 否:执行并且退出。
    • 是:走到下一步。只有要被更新的表才和这个规则作比较(INSERT INTO sales SELECT * FROM prices:中只有 sales 和规则比较)。如果有好几个表一起被更新(多表语句),第一个匹配的表(匹配 `do` 或 `ignore`)胜出。也就是说,只有第一个表和规则作比较。然后,如果还没有产生任何决定,就比较第二个表,以此类推。
  3. 是否有 --replicate-do-table 规则?

    • 是:这个表是否匹配这些规则?
      • 是:执行并且退出。
      • 否:走到下一步。
    • 否:走到下一步。
  4. 是否有 --replicate-ignore-table 规则?

    • 是:这个表是否匹配这些规则?

      • 是:忽略并且退出。
      • 否:走到下一步。
    • 否:走到下一步。
  5. 是否有 --replicate-wild-do-table 规则?

    • 是:这个表是否匹配这些规则?

      • 是:执行并且退出。
      • 否:走到下一步。
    • 否:走到下一步。
  6. 是否有 --replicate-wild-ignore-table 规则?

    • 是:这个表是否匹配这些规则?

      • 是:忽略并且退出。
      • 否:走到下一步。
    • 否:走到下一步。
  7. 没有匹配 --replicate-*-table 规则。是否有其他表匹配这些规则?


    • 是:循环查找匹配。
    • 否:已经测试所有要被更新的表且找不到任何匹配规则。是否有 --replicate-do-table--replicate-wild-do-table 规则?

      • 是:忽略并且退出。
      • 否:执行并且退出。
阅读(2219) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~