配置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来对比)。