分类: Mysql/postgreSQL
2008-05-11 17:53:49
如果你确定没有用户错误,但复制仍然不工作或不稳定,则是向我们发送bug通报的时候了。我们需要尽可能从你那儿获得更多的信息已跟踪bug。请花一些时间和努力编写一份好的bug通报。
如果你有一个重复的测试案例来说明bug,请把它输入我们的bug数据库,位置为。如果你有一个“phantom”问题(不能按照期望进行复制),则使用下面的程序:
1. 确认未包括用户错误。例如,如果你不用从服务器线程来更新从服务器,数据将不同步,并且会遇到唯一的键值违背更新。在这种情况下,从服务器线程停止并等待你手动清理表使它们同步。这不是复制问题。这是一个外部接口问题造成复制失败。
2. 用--logs-slave-updates和--logs-bin选项运行从服务器。这些选项使从服务器将从主服务器接收的更新记入自己的二进制日志。
3. 重新设置复制状态之前保存所有的证据。如果我们没有信息或只有粗略的信息,则难以或不可能跟踪问题。应搜集的证据为:
· 所有主服务器的二进制日志
· 所有从服务器的二进制日志
· 你发现问题时主服务器的SHOW MASTER STATUS的输出
· 你发现问题时主服务器的SHOW SLAVE STATUS的输出
· 主服务器和从服务器的错误日志
4. 使用mysqlbinlog检查二进制日志。下面命令应有助于发现有问题的查询,例如:
5. shell> mysqlbinlog -j pos_from_slave_status \
6. /path/to/log_from_slave_status | head
搜集了问题的证据后,首先作为一个测试案例隔离开。然后将问题输入我们的bug数据库,位置为,应提供尽可能多的信息。
当将多个服务器配置为复制主服务器时,使用auto_increment时应采取特殊步骤以防止键值冲突,否则插入行时多个主服务器会试图使用相同的auto_increment值。
服务器变量auto_increment_increment和auto_increment_offset可以帮助协调多主服务器复制和AUTO_INCREMENT列。每个变量有一个默认的(并且是最小的)值1,最大值为65,535。
将这些变量设置为非冲突的值,当在同一个表主插入新行时,多主服务器配置主的服务器将不会与AUTO_INCREMENT值冲突。
这两个变量这样影响AUTO_INCREMENT列:
· auto_increment_increment控制列值增加的间隔。例如:
· mysql> SHOW VARIABLES LIKE 'auto_inc%';
· +--------------------------+-------+
· | Variable_name | Value |
· +--------------------------+-------+
· | auto_increment_increment | 1 |
· | auto_increment_offset | 1 |
· +--------------------------+-------+
· 2 rows in set (0.00 sec)
·
· mysql> CREATE TABLE autoinc1 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
· Query OK, 0 rows affected (0.04 sec)
·
· mysql> SET @auto_increment_increment=10;
· Query OK, 0 rows affected (0.00 sec)
·
· mysql> SHOW VARIABLES LIKE 'auto_inc%';
· +--------------------------+-------+
· | Variable_name | Value |
· +--------------------------+-------+
· | auto_increment_increment | 10 |
· | auto_increment_offset | 1 |
· +--------------------------+-------+
· 2 rows in set (0.01 sec)
·
· mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
· Query OK, 4 rows affected (0.00 sec)
· Records: 4 Duplicates: 0 Warnings: 0
·
· mysql> SELECT col FROM autoinc1;
· +-----+
· | col |
· +-----+
· | 1 |
· | 11 |
· | 21 |
· | 31 |
· +-----+
· 4 rows in set (0.00 sec)
(这里注明如何使用SHOW VARIABLES以获得这些变量的当前值)。
· auto_increment_offset确定AUTO_INCREMENT列值的起点。影响到在复制设置主可以有多少主服务器(例如将该值设置为10表示设置可以支持10个服务器)。
考虑下面的命令,假定在前面所示示例中的相同的会话中执行这些命令:
mysql> SET @auto_increment_offset=5;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 10 |
| auto_increment_offset | 5 |
+--------------------------+-------+
2 rows in set (0.00 sec)
mysql> CREATE TABLE autoinc2 (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
Query OK, 0 rows affected (0.06 sec)
mysql> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT col FROM autoinc2;
+-----+
| col |
+-----+
| 5 |
| 15 |
| 25 |
| 35 |
+-----+
4 rows in set (0.02 sec)
详细信息参见5.3.3节,“服务器系统变量”。
这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。