分类: LINUX
2009-09-28 09:50:19
[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
--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
--skip-log-warnings
就可以禁用它。从MySQL 4.0.21和MySQL 4.1.3开始,除非这个选项的值大于1,否则放弃的连接不再记录在错误日志中。这个选项不只是用于限制同步,它产生的警告跨越了大部分操作。 --master-connect-retry=seconds
--master-host=host
--master-info-file=file_name
--master-password=password
--master-port=port_number
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
, --ssl-ca
, --ssl-capath
, --ssl-cert
, --ssl-cipher
, --ssl-key
选项。如果存在的话,`master.info` 文件中选项值优先被读取。这些选项是从MySQL 4.1.1之后开始可以用的。 --master-user=username
REPLICATION SLAVE
权限(在MySQL 4.0.2以前,则是 FILE
权限)。如果存在的话,`master.info` 文件中选项值优先被读取。如果没有设置,就当作是 test
。 --max-relay-log-size=#
--read-only
SUPER
权限用户之外的都不能更新数据。这能确保slave不会接受来自其他客户端的更新。这个选项是从MySQL 4.0.14开始有的。 --relay-log=file_name
host_name-relay-bin.nnn
,host_name 是slave服务器的主机名,nnn 是指中继日志的顺序号。可以用这个选项创建不依赖主机名的中继日志,或者在中继日志越来越大(不想降低 max_relay_log_size
的值)且需要将它们放在非数据文件目录下,或者想使用磁盘间的负载均衡来提高速度等情况。 --relay-log-index=file_name
host_name-relay-bin.index
,host_name 是slave服务器主机名。 --relay-log-info-file=file_name
--relay-log-purge={0|1}
SET GLOBAL relay_log_purge
来动态更改。这个选项从MySQL 4.1.1开始可以用。 --relay-log-space-limit=#
--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
USE
选中的)的语句。想要指定更多的数据库,只需多次使用该选项,每次指定一个数据库。注意,类似 UPDATE some_db.some_table SET foo='bar'
这样的跨库操作语句以及没有选中数据库的操作都不会被同步。如果必须使用跨库操作,要确保使用MySQL 3.23.28或更高,并且使用 --replicate-wild-do-table=db_name.%
选项。请仔细阅读最后面的注意事项。 --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
--replicate-do-db
选项相反。请仔细阅读最后面的注意事项。 --replicate-ignore-db=db_name
USE
选中的)的语句。想要指定更多的数据库,只需多次使用该选项,每次指定一个数据库。如果有跨库操作且希望这些操作要被同步就不要使用该选项。请仔细阅读最后面的注意事项。 --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
--replicate-ignore-db
选项相反。请仔细阅读最后面的注意事项。 --replicate-wild-do-table=db_name.tbl_name
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
--replicate-wild-ignore-table=foo%.bar%
就不会同步所有以 foo
开头的数据库下的以 bar
开头的数据表上的更新操作。--replicate-wild-ignore-table
选项的具体描述。模式中包含原义通配符的规则和 --replicate-wild-ignore-table
选项一样。--replicate-rewrite-db=from_name->to_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
--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
SHOW SLAVE HOSTS
语句时就会显示出来了。如果不想slave注册到master就无需设置这个选项。注意,这在slave连接到master之后,只根据这个配置master还不能直接从TCP/IP套接字中读取slave的IP地址。因为存在 NAT
或者其他路由机制,这个IP信息还不足以在master或者其他主机上连接到slave上。这个选项是从MySQL 4.0.0开始可以用的。
--report-port=port_number
--skip-slave-start
START SLAVE
语句来启动slave线程。
--slave_compressed_protocol={0|1}
--slave-load-tmpdir=file_name
tmpdir
的值一样。slave的SQL线程同步 LOAD DATA INFILE
语句时,它从中继日志中提取出要被加载的文件放到临时文件中,然后把它们加载到slave中。如果在master上加载的文件很大,那么slave上的临时文件也会很大。因此建议在slave上指定这个选项时把它放在剩余空间比较多的文件系统上。这是,最好也指定 --relay-log
到那个文件系统中,因为中继日志可能也会很大。--slave-load-tmpdir
必须指向基于磁盘的文件系统,而不能是基于内存的文件系统:slave可能会在机器重启后同步 LOAD DATA INFILE
语句时需要用到这个临时文件。这个目录同样不能在会被操作系统的启动进程清除的目录下。
--slave-net-timeout=seconds
--master-connect-retry
控制。
--slave-skip-errors= [err_code1,err_code2,... | all]
SHOW SLAVE STATUS
语句的结果中就能看到错误代码了。服务器错误代码详情请看""。all
,它能忽略所有的错误信息,不管什么情况都继续保持同步。不消说,如果使用这个选项值,就不可能期待有数据的完整性了。这种情况下,就不能抱怨slave的数据无论在哪个地方都和master不接近了。已经警告过你了。例如:
--slave-skip-errors=1062,1053
--slave-skip-errors=all
--replicate-*
模式根据以下规则来决定一个语句是要执行还是被忽略:
是否有 --replicate-do-db
或 --replicate-ignore-db
规则?
--binlog-do-db
和 --binlog-ignore-db
选项(详情请看"")。测试结果?是否有 --replicate-*-table
规则?
INSERT INTO sales SELECT * FROM prices
:中只有 sales
和规则比较)。如果有好几个表一起被更新(多表语句),第一个匹配的表(匹配 `do` 或 `ignore`)胜出。也就是说,只有第一个表和规则作比较。然后,如果还没有产生任何决定,就比较第二个表,以此类推。是否有 --replicate-do-table
规则?
是否有 --replicate-ignore-table
规则?
是否有 --replicate-wild-do-table
规则?
是否有 --replicate-wild-ignore-table
规则?
没有匹配 --replicate-*-table
规则。是否有其他表匹配这些规则?
--replicate-do-table
或 --replicate-wild-do-table
规则?