因为最近业务需求,需要建立一个数据仓库,为了避免主库受到影响,所以需要建立一个从库给数据仓库提供源数据。
目前2台机器都是 阿里云ECS云服务器, 所以两者通讯可以直接使用内网连接。
主库配置
修改主库配置文件 my.cnf :
1 2 3 4 5 6 7 8 9 10 11
| [mysqld] # 数据库唯一id, 该id 必须和其他链接的数据库不同 server-id= 1 #启用二进制日志; log-bin=mysql-bin # 日志格式, 有Mixed,Statement,Row三种,默认格式是 Statement,Mixed相当于前两种模式的结合 binlog_format=mixed # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 expire_logs_days = 10 # 可以选择需要同步哪些库 binlog-do-db=need_db
|
修改后, 保存,并重启数据库。
重启完成后,进入mysql,创建一个从库同步使用的帐号:
1 2 3 4
| > mysql -uroot -p
mysql> CREATE USER 'slave'@'172.18.18.2' IDENTIFIED BY '123456'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
|
创建帐号时, 为了安全着想 最好指定host参数,我这里填写的是从库阿里云的内网地址。
锁表,避免这段时间有新的数据产生, 执行 show master status
记住Position
1 2 3 4 5 6 7 8
| mysql> FLUSH TABLES WITH READ LOCK; mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | need_db | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
|
从库配置
修改从库配置文件 my.cnf :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [mysqld]
# 数据库唯一id, 该id 必须和其他链接的数据库不同 server-id= 1 #启用二进制日志; log-bin=mysql-bin # 日志格式, 有Mixed,Statement,Row三种,默认格式是 Statement,Mixed相当于前两种模式的结合 binlog_format=mixed # 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 expire_logs_days = 10 # 可以选择需要同步哪些库 replicate-do-db=need_db #如果发现主服务器断线,重新连接的时间差; master-connect-retry=60
|
保存并重启mysql服务。
重启完成后,进入mysql,开始配置主从链接
1 2 3 4 5 6 7 8 9 10
| > mysql -uroot -p
# 先停止slave服务 mysql> slave stop;
# 配置主从参数 mysql> change master to master_host='172.18.18.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=154, master_connect_retry=30;
# 启动slave服务 mysql> slave start;
|
参数解释:
1 2 3 4 5 6 7
| master_host: Master 的IP地址 master_user: 在 Master 中授权的用于数据同步的用户 master_password: 同步数据的用户的密码 master_port: Master 的数据库的端口号 master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值 master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
|
然后回到主库,解锁表
回到从库查看状态:
1
| mysql> show slave status \G;
|
如果 SlaveIORunning 和 SlaveSQLRunning 是Yes 说明已经正常工作了