第二,如果master必须低于MySQL 4.1.3,则会话(session)的字符集必须和全局值一样(也就是说,不能执行 SET NAMES, SET CHARACTER SET 等语句),因为这些对字符集的修改在slave不能识别。如果master是4.1.3或者更高,slave也是这样的话,那么会话字符集就可以随便修改了(执行 NAMES, CHARACTER SET, COLLATION_CLIENT, COLLATION_SERVER 等),并且这些修改都会被记录到二进制日志中,然后同步到slave上,它就知道怎么做了。该会话还会阻止试图修改这些全局变量的操作;就如前面所说,master和slave必须使用同样的全局字符集。
在master上执行的 CREATE TABLE 语句如果包括了 DATA DIRECTORY或 INDEX DIRECTORY 子句,那么它也会应用于slave上。如果slave上不存在对应的目录或者没有权限时便出现问题。从MySQL 4.0.15开始,有个 sql_mode 选项叫 NO_DIR_IN_CREATE。如果slave的SQL模式包含这个选项,那么它在同步 CREATE TABLE 语句前会忽略前面提到的2个子句。结果就是 MyISAM 的数据和索引文件都只能放在该表的数据库目录下。
尽管没听说过发生过类似的情况,不过理论上确实存在这种可能性:如果一个查询被设计为非确定方式的修改数据,那么可能导致master和slave的数据不一致。那么,就把决定的权力交给查询优化器吧。(通常这不是一个好的做法,甚至超出了同步的范围,详情请看"1.8.7.3 Open Bugs and Design Deficiencies in MySQL")
可以放心地关闭master(干净地)之后再重启它。如果slave到master的连接断开了,它会立刻重连。如果失败了,slave会定期重试(默认是每60秒重试一次,可通过 --master-connect-retry 选项来修改)。slave也会处理网络断开的情况。不过,slave会在 slave_net_timeout 秒之后如果还没收到来自master的数据才会当作网络断开的情况来处理。如果断开时间不长,可以减少 slave_net_timeout 的值。详情请看"5.2.3 Server System Variables"。
也可以放心地关闭slave(干净地),它会记录停止的地方。不干净地关闭slave可能产生问题,特别是系统关闭了但缓存还没刷新到磁盘时。可以提供不间断电源来提高系统容错性。master的不干净关闭可能导致表和二进制内容的不一致;如果是 InnoDB 表,使用 --innodb-safe-binlog 选项在master上就能避免这个问题。详情请看"5.9.4 The Binary Log"。