MySQL的复制(5.0.x版)part
6.8. 复制启动选项
这部分描述了在从复制服务器上你可以运用的选项.你可以指定这些选项或者在命令行,或者在一个option文件中.
在主服务器和从服务器上,均必须使用server-id选项为每个服务器建立唯一的复制ID。
你应为每个主服务器和从服务器从1到232–1的范围挑一个唯一的正整数。例如:server-id=3
用于主服务器上控制二进制日志的选项的相关描述见5.11.3节,“二进制日志”。
某些从服务器复制选项按特殊方式处理,当从服务器启动时如果master.info文件存在并且包含选项值,它们将被忽略掉。下面的选项按这种方式处理:
· --master-host
· --master-user
· --master-passWord
· --master-port
· --master-connect-retry
· --master-ssl
· --master-ssl-ca
· --master-ssl-capath
· --master-ssl-cert
· --master-ssl-cipher
· --master-ssl-key
5.0中的master.info文件格式包括对应SSL选项的值。另外,文件格式包含了文件的行数,作为第一行. (See Section 6.3.4, “Replication Relay and Status Files”.) 如果你将旧的服务器(4.1.1之前)升级到新的版本,新服务器启动时自动将smaster.info文件升级到新的格式。然而,如果将新服务器降级到旧的版本,首次启动旧版本的服务器之前应删除第1行。
如果从服务器启动时master.info文件不存在,选项采用选项文件或命令行中指定的值。首次将服务器作为从服务器启动时,或者已经运行RESET SLAVE然后已经关闭并重启从服务器时会发生。
如果从服务器启动时master.info文件存在,服务器忽略那些选项。使用master.info文件中发现的值。如果你使用与master.info文件中相对应的启动选项的不同的值重启从服务器,启动选项的不同的值不会生效,因为服务器继续使用master.info文件。要想使用启动选项的不同的值,必须删除master.info文件并重启从服务器,或(最好是)在从服务器运行时使用CHANGE MASTER TO语句重新设置值。
假定你在my.cnf文件中指定该选项:
[Mysqld]
master-host=some_host
第1次作为复制从服务器启动服务器时,从my.cnf文件读取并使用选项。服务器然后记录这个值到master.info文件中。下次启动服务器时,它只从服务器的master.info文件读取master host值并忽略选项文件中的值。如果你修改my.cnf文件为some_other_host指定其它主服务器主机(master host,更改仍然不会生效。你应使用CHANGE MASTER TO来替代
因为服务器给已有master.info文件的优先权高于刚刚描述的启动选项,你可以选择不使用这些值的启动选项,而是使用CHANGE MASTER TO语句来指定。参见13.6.2.1节,“CHANGE MASTER TO语法”。
这个例子展示了一个具有更加广泛用途的配置从服务器的的启动选项
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=pertinax
master-password=freitag
master-connect-retry=60
report-host=db-slave.mycompany.com
下面列出了控制复制的启动选项:许多选项可以在服务器运行时通过CHANGE MASTER TO语句重新进行设置。其它选项,例如--replicate-*选项,只能在从服务器启动时进行设置。
- --log-slave-updates
通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其sql线程执行的更新记入到从服务器自己的二进制日志。为了使该选项生效,还必须用--logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-updates。例如,可能你想要这样设置:
A -> B -> C
也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B,这样从A收到的更新就会被B记录到自己的二进制日志中.
- --log-warnings[=level]
让从服务器向错误日志输出更详细的关于其执行操作的消息。例如,通知你网络/连接失败后已经成功重新连接,并通知你每个从服务器线程如何启动。该选项默认启用;要想禁用它,使用--skip-logs-warnings。放弃的连接不记入错误日志,除非该值大于1。
- --master-connect-retry=seconds
在主服务器宕机或连接丢失的情况下,从服务器线程重新尝试连接主服务器之前睡眠的秒数。如果主服务器.info文件中的值可以读取则优先使用。如果未设置,默认值为60。连接重试不会被启动直到从服务器从主读数据时间超过--slave-net-timeout.重试的次数由--master-retry-count限制.
- --master-host=host_name
主复制服务器的主机名或IP地址。如果master.info文件中的值可以读取则优先使用。
如果没有给出该选项,从服务器线程不启动。
- --master-info-file=file_name
从服务器用于记录主服务器的相关信息使用的文件名。缺省的文件名是数据目录下的master.info
- --master-password=password
连接主服务器时从服务器线程用于认证的账户的密码。如果主服务器.info文件中的值可以读取则优先使用。如果未设置,假定 密码为空。
- --master-port=port_number
主服务器正帧听的tcp/IP端口号。如果主服务器.info文件中的值可以读取则优先使用。如果未设置,假定使用编译进来的设定值。(通常是 3306)
- --master-retry-count=count
在放弃前从试图连接到主的次数.每隔--master-connect-retry重连,当从服务器读数据超过--slave-net-timeout选项的时间时重连被触发.缺省值是86400.
l --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设置与主服务器的安全复制连接。它们的含义与5.8.7.6节,“SSL命令行选项”中描述的相应—ssl、--ssl-ca、--ssl-capath、--ssl-cert、--ssl-cipher、--ssl-key选项相同。如果主服务器.info文件中的值可以读取则优先使用。
l --master-user=user_name
连接主服务器时从服务器线程用于认证的账户的用户名。该账户必须具有REPLICATION SLAVE权限。如果主服务器.info文件中的值可以读取则优先使用。如果未设置主服务器用户,假定使用用户test。
l --max-relay-log-size=size
中继日志以这个大小自动循环(The size at which the server rotates relay log files automatically)For more infORMation, see Section 6.3.4, “Replication Relay and Status Files”. 缺省大小 1GB.
l --read-only
该选项让从服务器只允许来自从服务器线程或具有SUPER权限的用户的更新。可以确保从服务器不接受来自客户的更新。在5.0.16,这个选项不适用于TEMPORARY表
l --relay-log=file_name
中继日志名。默认名为host_name-relay-bin.nnnnnn,其中host_name是从服务器主机的名,nnnnnn表示中继日志在编号序列中创建。如果中继日志太大(并且你不想降低max_relay_log_size),需要将它们放到数据目录之外的其它地方,或者如果想要通过硬盘之间的负载均衡提高速度,可以指定选项创建与主机名无关的中继日志名。
l --relay-log-index=file_name
中继日志索引文件使用的位置和名称。默认名为host_name-relay-bin.index,其中host_name为从服务器名。
l --relay-log-info-file=file_name
从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info。
l --relay-log-purge={0|1}
禁用或启用不再需要中继日志时是否自动清空它们。默认值为1(启用)。这是一个全局变量,可以用SET GLOBAL relay_log_purge = N.动态更改
l --relay-log-space-limit=size
限制所有中继日志在从服务器上所占用空间的上限(0值表示“无限制”)。从服务器主机硬盘空间有限时很有用。达到限制后,I/O线程停止从主服务器读取二进制日志中的事件,直到SQL线程被闭锁并且删除了部分未使用的中继日志。请注意该限制并不是绝对的:有可能SQL线程删除中继日志前需要更多的事件。在这种情况下,I/O线程将超过限制,直到SQL线程可以删除部分中继日志。(不这样做将会造成死锁)。--relay-log-space-limit的值不能小于2倍的--max-relay-logs-size(或是--max-binlog-size,如果--max-relay-logs-size为0的情况下)。在这种情况下,有可能I/O线程等待释放空间,因为超过了--relay-log-space-limit,但SQL线程没有要清空的中继日志,不能满足I/O线程的需求。强制I/O线程临时忽视--relay-log-space-limit。
l --replicate-do-db=db_name
告诉从服务器限制默认数据库(由USE所选择)为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次。请注意不复制跨数据库的语句,例如当已经选择了其它数据库或没有数据库时执行UPDATE some_db.some_table SET foo='bar'。
· Warning
To specify multiple databases you must use multiple instances of this option. Because database names can contain commas, if you supply a comma separated list then the list will be treated as the name of a single database.
一个不能按照期望工作的例子:如果用--replicate-do-db=sales启动从服务器,并且在主服务器上执行下面的语句,UPDATE语句不会复制:
· USE prices;
· UPDATE sales.january SET amount=amount+1000;
“只检查默认数据库”行为的主要原因是语句自己很难知道它是否应被复制(例如,如果你正使用跨数据库的多表DELETE语句或多表UPDATE语句)。如果不需要,只检查默认数据库比检查所有数据库要快得多。
如果需要跨数据库进行更新,应使用--replicate-wild-do-table=db_name.%。See Section 6.9, “How Servers Evaluate Replication Rules”.
l --replicate-do-table=db_name.tbl_name
告诉从服务器线程限制对指定表的复制。要指定多个表,应多次使用该选项,每个表使用一次。同--replicate-do-db对比,允许跨数据库更新。请读取该选项列表后面的注意事项。Section 6.9, “How Servers Evaluate Replication Rules”.
l --replicate-ignore-db=db_name
告诉从服务器不要复制默认数据库(由USE所选择)为db_name的语句。要想忽略多个数据库,应多次使用该选项,每个数据库使用一次。如果正进行跨数据库更新并且不想复制这些更新,不应使用该选项。See Section 6.9, “How Servers Evaluate Replication Rules”.
一个不能按照期望工作的例如:如果用--replicate-ignore-db=sales启动从服务器,并且在主服务器上执行下面的语句,UPDATE语句不会复制:
· USE prices;
· UPDATE sales.january SET amount=amount+1000;
- Note
In the preceding example the statement is replicated because --replicate-ignore-db only applies to the default database (set through the USE statement). Because the sales database was specified explicitly in the statement, the statement has not been filtered.
如果需要跨数据库更新,应使用--replicate-wild-ignore-table=db_name.%来代替。See Section 6.9, “How Servers Evaluate Replication Rules”.
l --replicate-ignore-table=db_name.tbl_name
告诉从服务器线程不要复制更新指定表的任何语句(即使该语句可能更新其它的表)。要想忽略多个表,应多次使用该选项,每个表使用一次。同--replicate-ignore-db对比,该选项可以跨数据库进行更新。See Section 6.9, “How Servers Evaluate Replication Rules”.
l --replicate-rewrite-db=from_name->to_name
告诉从服务器如果默认数据库(由USE所选择)为主服务器上的from_name,则翻译为to_name。只影响含有表的语句(不是类似CREATE DATABASE、DROP DATABASE和ALTER DATABASE的语句),并且只有from_name为主服务器上的默认数据库时。该选项不可以跨数据库进行更新。在测试--replicate-*规则之前数据库名翻译已经完成。
果在命令行中使用该选项, ‘>’字符专用于命令解释器,应将选项值引起来。例如:
· shell> mysqld --replicate-rewrite-db="olddb->newdb"
l --replicate-same-server-id
用于从服务器上。通常可以默认设置为0以防止循环复制中的无限循环。如果设置为1,该从服务器不跳过有自己的服务器id的事件;通常只在有很少配置的情况下有用。如果使用--logs-slave-updates不能设置为1。请注意默认情况下如果有从服务器的id,服务器I/O线程不将二进制日志事件写入中继日志(该优化可以帮助节省硬盘的使用)。因此如果想要使用--replicate-same-server-id,让从服务器读取自己的SQL线程执行的事件前,一定要用该选项启动。
l --replicate-wild-do-table=db_name.tbl_name
告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。模式可以包含‘%’和‘_’通配符,与LIKE模式匹配操作符具有相同的含义。要指定多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。See Section 6.9, “How Servers Evaluate Replication Rules”.
例如:--replicate-wild-do-table=foo%.bar%只复制数据库名以foo开始和表名以bar开始的表的更新。
要想在数据库或表名模式中包括通配符,用反斜线对它们进行转义。例如,要复制名为my_own%db的数据库的所有表,但不复制my1ownAABCdb数据库的表,应这样转义‘_’和‘%’字符:--replicate-wild-do-table=my\_own\%db。如果在命令行中使用选项,可能需要双反斜线或将选项值引起来,取决于命令解释器。例如,用bash外壳则需要输入--replicate-wild-do-table=my\\_own\\%db。
l --replicate-wild-ignore-table=db_name.tbl_name
告诉从服务器线程不要复制表匹配给出的通配符模式的语句。要想忽略多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。See Section 6.9, “How Servers Evaluate Replication Rules”.
例如:--replicate-wild-ignore-table=foo%.bar%不复制数据库名以foo开始和表名以bar开始的表的更新。
关于匹配如何工作的信息,参见--replicate-wild-do-table选项的描述。在选项值中包括通配符的规则与--replicate-wild-ignore-table相同
l --report-host=slave_name
从服务器注册过程中报告给主服务器的主机名或IP地址。该值出现在主服务器上SHOW SLAVE HOSTS的输出中。如果不想让从服务器自己在主服务器上注册,则不设置该值。请注意从服务器连接后,主服务器仅仅从TCP/IP套接字读取从服务器的IP号是不够的。由于 NAT和其它路由问题,IP可能不合法,不能从主服务器或其它主机连接从服务器。
l --report-password=password
The account password of the slave to be reported to the master during slave reGIStration. This value appears in the output of SHOW SLAVE HOSTS on the master server if the --show-slave-auth-info option is given.
l --report-port=slave_port_num
连接从服务器的TCP/IP端口号,从服务器注册过程中报告给主服务器。只有从服务器帧听非默认端口或如果有一个特殊隧道供主服务器或其它客户连接从服务器时才设置它。如果你不确定,不设置该选项
l --report-user=user_name
The account username of the slave to be reported to the master during slave registration. This value appears in the output of SHOW SLAVE HOSTS on the master server if the --show-slave-auth-info option is given.
- id="option_mysqld_slave_compressed_protocol" --show-slave-auth-info
Display slave usernames and passwords in the output of SHOW SLAVE HOSTS on the master server for slaves started with the --report-user and --report-password options.
l --skip-slave-start
告诉从服务器当服务器启动时不启动从服务器线程。稍后使用START SLAVE语句在启动线程。
l --slave_compressed_protocol={0|1}
如果该选项设置为 1,如果从服务器和主服务器均支持,使用压缩从服务器/主服务器协议。默认是0不压缩
l --slave-load-tmpdir=file_name
从服务器创建临时文件的目录名。该选项默认等于tmpdir系统变量的值。当从服务器SQL线程复制LOAD DATA INFILE语句时,从中继日志将待装载的文件提取到临时文件,然后将这些文件装入到表中。如果装载到主服务器上的文件很大,从服务器上的临时文件也很大。因此,建议使用该选项告诉从服务器将临时文件放到文件系统中有大量可用空间的目录下。在这种情况下,也可以使用--relay-log选项将中继日志放到该文件系统中,因为中继日志也很大。--slave-load-tmpdir应指向基于硬盘的文件系统,而非基于内存的文件系统:从服务器需要用临时文件在机器重启时用于复制LOAD DATA INFILE。系统启动过程中操作系统也不能清除该目录。
l --slave-net-timeout=seconds
在从认为连接中断,放弃读和尝试重新连接之前等待主更多数据的秒数。超时后立即开始第1次重试。由--master-connect-retry选项控制重试之间的间隔。由master-retry-count限制重试的次数.缺省是3600秒(1小时)
l --slave-skip-errors=[err_code1,err_code2,...|all]
通常情况,当出现错误时复制停止,这样给你一个机会手动解决数据中的不一致性问题。该选项告诉从服务器SQL线程当语句返回任何选项值中所列的错误时继续复制。
如果你不能完全理解为什么发生错误,则不要使用该选项。如果复制设置和客户程序中没有bug,并且MySQL自身也没有bug,应不会发生停止复制的错误。滥用该选项会使从服务器与主服务器不能保存同步,并且你找不到原因。
对于错误代码,你应使用从服务器错误日志中错误消息提供的编号和SHOW SLAVE STATUS的输出。服务器错误代码列于附录B:错误代码和消息。
你也可以(但不应)使用不推荐的all值忽略所有错误消息,不考虑所发生的错误。无需而言,如果使用该值,我们不能保证数据的完整性。在这种情况下,如果从服务器的数据与主服务器上的不相近请不要抱怨(或编写bug报告)。已经警告你了。
例如:
· --slave-skip-errors=1062,1053
· --slave-skip-errors=all
6.9. 服务器如何测试复制规则
如果主没有将语句写入二进制日志,语句就不会被复制.如果服务器将这个语句写入日志,这个语句就会被发送到所有的从,然后每个从来决定执行还是忽略它.
在主的那一端,决定是否将语句记入日志是基于用来控制二进制日志记录的
--binlog-do-db
和 --binlog-ignore-db
选项.对于服务器评估这些选项所用规则的说明, see Section 5.11.3, “The Binary Log”.在从的一端,决定是否执行或者忽略从主服务器收到的语句取决于从服务器启动时的
--replicate-*
选项.从服务器依照以下过程来评估这些选项,先检查数据库级的选项,然后再检查表级别的选项
最简单情况,在没有--replicate-*选项时,这个过程产生如下结果:从会执行它从主收到的所有语句.否则,结果取决于所给出的特定选项.一般来说为了更加简单的决定一个选项会有甚么效果,推荐你不要混合用”do”和”ignore”选项,或者”wildcard”和”non_wildcard”选项.
l
第一步.检查数据库选项
在这一步,从会检查是否有
--replicate-do-db
或者 --replicate-ignore-db
这种指定数据库的选项:
1.
无:接受这条语句然后进行表检查的步骤
2.
有:用同样的规则测试--binlog-do-db
和--binlog-ignore-db
选项用来决定接受或者忽略这条语句.会带来如下结果:
接受:不立即执行语句,延迟做决定,进到下一步表检查
忽略:忽略这个语句,退出
这一步可能会接受一条语句做进一步的选项检查,或者会将这条语句忽略.尽管如此,这一步被接受的语句并不会立即执行,他们会被传到下一步进行表选项的检查.
l 第二步,检查表选项
首先,作为一个初步条件,从会检查这个语句是否在一个存储函数或者存储过程里面(在5.0.12之前的版本).如果在,执行这条语句然后退出(在5.0.12存储过程没有这个测试,因为过程的日志记录发生在所执行语句的级别而不是
CALL
级别
接着,从检查表选项然后评估他们.如果服务器到了这个点,它会执行所有不带表选项的语句.如果有”do”的表选项,将要执行的语句必须匹配它们中的一个,否则就忽略.如果有”ignore”选项,所有的语句被执行除了那些匹配ignore选项的.下面是详细的测试步骤:
1.
是否有--replicate-*-table选项?
无:没有表限制,所以所有的语句都匹配.执行它然后退出.
有:有表限制.评估要被更新的表.因为可能有多个表要更新,所以对每个表循环做如下步骤来检查匹配选项(首先是非通配non-wild选项,然后是通配选项wild)
只有待更新的表根据这些规则进行比较..例如,如果语句是INSERT INTO sales SELECT * FROM prices
,那就只拿sales来比较这项选项). 如果要更新几个表(多表语句),第1个匹配的表(匹配“do”或“ignore”)获赢。也就是说,根据这些规则比较第1个表。然后,如果不能进行决策,根据这些规则比较第2个表等等。2.
是否有--replicate-do-table
无:进行下一步
有:表匹配选项吗?
不:进行下一步
是:执行这个语句,退出
3.
是否有
--replicate-ignore-table
无:进行下一步
有:表匹配选项吗?
不:进行下一步
是:忽略这个语句,退出
4. 是否有
--replicate-wild-do-table
无:进行下一步
有:表匹配选项吗?
不:进行下一步
是:执行这个语句,退出
5. 是否有
--replicate-wild-ignore-table
无:进行下一步
有:表匹配选项吗?
不:进行下一步
是:忽略这个语句,退出
6.
没有--replicate-*-table
选项被匹配.有其他表要根据这些选项测试吗?
无:
我们现在已经测试了所有待更新的表,结果不能匹配任何规则。是否有--replicate-do-table或--replicate-wild-do-table规则? 无: 没有”do”的表选项,所以没有明确的”do”匹配要求.执行这条语句,退出
有:有”do”的表选项,所以这条语句仅仅在匹配某个选项的时候才会执行.忽略这个语句,退出
有::继续循环
举例:
l 没有
--replicate-*
从执行所有从主那里收到的语句
l
有--replicate-*-db,
但是没有表选项
从用数据库选项来接受或忽略语句.接着它会执行所有根据这些选项所接受的语句因为并没有表限制.
l
有--replicate-*-table,但没有数据库选项
在数据库检查那个步骤所有的语句被接受因为并没有数据库选项.从依据表选项来执行或者忽略语句.
l 同时有数据库和表选项
从依据数据库选项来接受或者忽略语句.然后它根据表选项来测试所有依据那些选项所接受的语句.在一些情况下,这个过程看起来违反常理.思考下面的例子:
· [mysqld]
· replicate-do-db = db1
· replicate-do-table = db2.mytbl2
架设db1是默认的数据库,从接受了下面这个语句:
· INSERT INTO mytbl1 VALUES(1,2,3);
数据库是db1,这符合数据库检查那一步的
--replicate-do-db
选项.然后进行表检查.如果没有表选项的话,这个语句就会被执行.但是因为选项里面包含了一个”do”的表选项,语句必须匹配它才能被执行.这条语句不匹配,所以被忽略.(db1里面所有的表都会执行这个过程)
相关文章