0、环境
系统:ubuntu14.04(阿里云\腾讯云)
数据库:mysql5.6
主:阿里云ubuntu
从:腾讯云ubuntu
默认需要同步的数据库已经事先创建。
1、原理
我们设置一个主库(Master),和一个从库(Slave或Secondary)。从库从主库复制数据内容,目的为灾难备份、读写分离等。
主库开启binary log,开启后每一次操作更新、修改、删除等都会记录在案,所以从库的同步过程其实就是获得这些过程,然后将现场还原,就达到了数据同步的目的。
2、开启mysql远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
PS:使用mysql的root用户和远程是很危险的,而且最后WITH GRANT OPTION还能授权,这里只是示范。最安全肯定是ssh登录再去访问数据库,又或者新建一个mysql用户专门用于同步。
上面的语句完成后,就可以用:
用户名为:root
密码为:123456(这个设置的密码不是原来ssh登录进去的密码,当然你也可以设置成一样的吧)
shell> mysql -u root -h xx.xx.xx.xx -p
shell> 123456
查看用户是否可以通过网络访问
root@iZwz96uh8912ewgq9yv5nxZ:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 101
Server version: 5.6.33-0ubuntu0.14.04.1-log (Ubuntu)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select user , host from user;
+------------------+-------------------------+
| user | host |
+------------------+-------------------------+
| root | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | izwz96uh8912ewgq9yv5nxz |
| debian-sys-maint | localhost |
| root | localhost |
+------------------+-------------------------+
6 rows in set (0.01 sec)
mysql>
mysql -u root -p
use mysql
select user , host from user;
看到有个%号说明那个用户可以任意host远程直接登录mysql了。
最后还有一个要注意的地方,将/etc/mysql/my.conf(或者/etc/mysql/mysql.conf.d/mysqld.cnf)的配置文件的bind-address行注释掉,又或者改成bind-address = 0.0.0.0
3、配置主服务器
cd /etc/mysql
cp my.cnf mycnf.bak
nano my.cnf
修改配置文件:
server-id = 1(服务id,这个需要每个不同)
log_bin = /var/log/mysql/mysql-bin.log(这是主服务器,必须开启log_bin,这句就是开启了)
binlog_format =mixed(混合比较好)
binlog_do_db = master(需要同步的数据库,如果多个数据库,重复这个配置)
binlog_ignore_db = mysql(排除不需要同步的数据库,如果多个数据库,重复这个配置)
都是有默认的,去除前面的#号就行了,binlog_format=mixed这句是没有的,自己加。
重启mysql,让配置生效:
sudo service mysql restart
得到当前binlog信息:
mysql> show master status;
+------------------+----------+--------------+------------------+--------------- ----+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_ Set |
+------------------+----------+--------------+------------------+--------------- ----+
| mysql-bin.000003 | 232 | master | mysql | |
+------------------+----------+--------------+------------------+--------------- ----+
1 row in set (0.03 sec)
我们关注File(mysql-bin.000003)和Position(232),这两个状态是我们需要同步需要用到的,此时不要动数据库了,不管是增删改查都会改变Posituion。
你这里看到Binlog_Do_DB是叫做master,是因为我数据库名就叫master,其他名字也可以的,看你具体创建。
4、配置从服务器
首先检查能不能远程主数据库:
shell> mysql -u root -h xx.xx.xx.xx -p
shell> (输入密码123456,因为我们主服务其授权的时候的密码是123456)
编辑mysql配置文件:
cd /etc/mysql
cp my.cnf mycnf.bak
nano my.cnf
修改配置文件:
server-id = 2(服务id,这个需要每个不同)
log_bin = /var/log/mysql/mysql-bin.log(这是主服务器,必须开启log_bin,这句就是开启了)
binlog_format =mixed(混合比较好)
binlog_do_db = master(需要同步的数据库,如果多个数据库,重复这个配置)
binlog_ignore_db = mysql(排除不需要同步的数据库,如果多个数据库,重复这个配置)
重启mysql服务:
sudo service mysql restart
让主服务器同步数据到从服务器
mysql> stop slave;
mysql> change master to master_host='xx.xx.xx.xx', master_user='root',master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=232;(保证是最新的position)
mysql> start slave;
查看从数据库信息:
show slave status;
此时你看到
Slave_IO_Running | Slave_SQL_Running
| Yes | Yes
就说明配置成功了。
这时你总算可以去操作主数据库了。
这时你创建一个表插入数据你可以看到从数据库也改变了。
参考文章:配置MySQL主从复制