Mysql主从机制搭建

注意事项
1、主从服务器操作系统版本和位数一致。
2、MySQL版本一致。

服务器配置
master:192.168.1.120
slave:192.168.1.119

Master(192.168.1.120)服务器配置

vim /etc/my.cnf
[mysqld]
# 唯一的服务辨识号,数值位于 1 到 2^32-1之间.
# 此值在master和slave上都需要设置.
# 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id=1

# 打开二进制日志功能.
# 在复制(replication)配置中,作为 MASTER 主服务器必须打开此项
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.
log-bin=master-bin
log-bin-index=master-bin.index

#需要备份的数据库
binlog-do-db=orders

#不需要备份的数据库
#若没有配置binlog-do-db和binlog_ignore_db,表示备份全部数据库。
binlog-ignore-db=mysql

2、重启mysqld服务

service mysqld restart

3、为从MySQL创建用户

#登录
mysql -uroot -p
Enter password: 

#创建用户
mysql> create user 'slave'@'192.168.1.119(从机ip)' identified by '1';
        
#配置主从复制权限
mysql> grant replication slave on *.* to 'slave'@'192.168.1.119(从机ip)' identified by '1';

4、若orders中已有数据,还需要锁定主服务器数据库,然后将数据导入到从数据库

#锁定
mysql> flush tables with read lock;

#数据复制到从数据库后,查看主数据库master状态并解锁:
mysql> show master status;  
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 |      648 | orders       | mysql            |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)  
  
mysql> unlock tables;

Slave(192.168.1.119)服务器配置
1、配置服务ID

vim /etc/my.cnf 

[mysqld]
#server_id是必须的,而且唯一
server-id=2

# 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据
#read_only

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 需要打开slave的二进制日志
#log_bin=mysql-bin

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 你需要在服务器B上打开此项.
# 此选项打开在从线程上重做过的更新的日志, 并将其写入从服务器的二进制日志.
# 如果打开log_bin,却没有设置log_slave_updates,这是一种错误的配置。
#log_slave_updates

2、重启MySQL服务
3、复制配置

#登录
mysql -uroot -p
Enter password: 
       
#执行
mysql> change master to master_host='192.168.1.120',
       master_user='slave',
       master_password='1',
       master_port=3306,
       master_log_file='master-bin.000004',
       master_log_pos=648,
       master_connect_retry=10;

参数详解:
master_host:主服务器的IP。
master_user:配置主服务器时建立的用户名
master_password:用户密码
master_port:主服务器mysql端口,如果未曾修改,默认即可。
master_log_file:日志文件名称,填写查看master状态时显示的File
master_log_pos:日志位置,填写查看master状态时显示的Position
master_connect_retry:重连次数

4、启动进程

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.120
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 648
               Relay_Log_File: magic-VirtualBox-relay-bin.000003
                Relay_Log_Pos: 507
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

若Slave_IO_Running和Slave_SQL_Running均为Yes,则表示配置成功。

5、中间遇到了一些问题,解决如下

Slave_IO_Running: No
Slave_SQL_Running: No
Last_Errno: 1146
Last_Error: Error 'Table 'orders.user_orders' doesn't exist' on query. Default database: 'orders'. Query: 'INSERT INTO `orders`.`user_orders` (`id`, `user_id`, `user_name`) VALUES (NULL, '2', 'magic.shen')'

# 首先停止主从同步,
# stop slave;
# 检查 master status,中 Position 是否和配置的一致
# 手动将master上的orders库结构、数据导入到slave上
# 重启slave
# start slave;