MySQL的Master-Slave主从配置

配置Master:

修改my.cnf配置:

[mysqld]
log-bin = /var/log/mysql/mysql-bin.log
server-id = 1
binlog_do_db = testdb

然后重启server。

server-id必须每个mysql唯一。

slave配置:

[mysqld]
server-id=2
replicate-do-db = testdb

然后重启。

创建slave访问master的用户,在master的mysql上面执行命令:

mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';

master 锁表,记录File和Position,在master上面执行命令:

mysql> flush tables with read lock;
mysql> show master status;
+------------------+----------+--------------+-------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB        |
+------------------+----------+--------------+-------------------------+
| mysql-bin.000001 |      107 | testdb    | information_schema,test |
+------------------+----------+--------------+-------------------------+
1 row in set (0.00 sec)

这时打开另一个shell,将需要同步的DB数据dump一份出来:

$ mysqldump -uroot -p testdb > testdb.sql

完成后,在master的mysql命令行中解锁:

mysql> unlock tables;

然后,将刚才从master dump出的数据导入到slave 数据库中。

导入完成后,就可以开启同步了,在slave中执行mysql 命令:

mysql> change master to MASTER_HOST='192.168.2.30', MASTER_USER='repl',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
mysql> START SLAVE;

其中的MASTER_LOG_FILE和MASTER_LOG_POS参数,就是我们刚才在master上执行show master status得到的。

查看slave状态:

mysql> show slave status;

如果遇到报错:

Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a 
storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is 
READ COMMITTED or READ UNCOMMITTED.

修改my.cnf中的mysqld节点,添加:

binlog_format = row

mysql所有用户登陆都报错:ERROR 1045 (28000): Access denied for user,解决:

$ killall mysqld
$ /usr/sbin/mysqld --skip-grant-tables
# 开另一个shell
$ mysql 
$mysql> update mysql.user set password=password("123456") where user = 'root';

在使用Master-Slave过程当中遇到的问题:

程序在写入一条纪录后,马上又在别的地方用id去读这条刚插入的纪录,恰好从slave读的话,很有可能读不出来,因为同步需要时间。解决办法就是尽量避免这种写入后就立马读的情况。

Master-Slave中的Master有一个表存储了charset为utf8mb4类型的文本,存储emoji表情用的,发现同步到slave后,emoji字符变得不一样了(可通过select md5来对比)。