MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。
1.主从数据库同步数据原理:
Mysql主从复制的实现原理图大致如下(来源网络):
主数据库更改数据库时,会将更改写入一个二进制文件。从数据库会启动一个I/O线程,读取二进制文件,将读取到的内容写入日个relay log的文件中。从数据库还会启动一个sql线程,读取relay log中的内容,根据读取到的内容,更改从数据库的内容,从而实现主数据库的修改从数据库实时更新的功能。
2.主从数据库同步的基本操作
主从数据库同步功能是mysql自带的,在这里我们只要进行一些配置就行了。我的系统是windows 10,mysql版本是8.0.16。
a.修改mysql配置文件my.ini
我在本地windows上启动了两个mysql服务,具体方法请参考我的另一篇简书
https://www.jianshu.com/p/99f16e7bdd82
找到两个服务的安装目录下的my.ini的配置文件,进行修改。
主数据库的配置文件修改如下:
[client]
port=3307
[mysqld]
server-id=1
### 启用二进制日志(必须)
log-bin=master-bin
log-bin-index=master-bin.index
basedir="D:\\softwareinstall\mysql2\mysql-8.0.16\mysql-8.0.16-winx64"
datadir="D:\\softwareinstall\mysql2\mysql-8.0.16\mysql-8.0.16-winx64\data"
port=3307
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
从数据库的配置文件修改如下:
[client]
### 端口号一定要修改,默认为3306,因为另一个服务已经占用该端口,所以这里必须修改。
port=3308
[mysqld]
server-id=2
##从数据库的配置
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#存放数据的地址设置为自己解压目录的地址
#basedir为mysql安装文件夹绝对路径,也就是解压后的文件夹绝对路径
basedir="D:\\softwareinstall\mysql3\mysql-8.0.16-winx64"
#datadir存放的是数据库数据,也就是解压后的文件夹里面的data文件夹绝对路径
datadir="D:\\softwareinstall\mysql3\mysql-8.0.16-winx64\data"
### 端口号一定要修改,默认为3306,因为另一个服务已经占用该端口,所以这里必须修改。
port=3308
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
配置完成之后,重启两个mysql服务。
b.在主库上授权slave。
CREATE USER 'repl'@'127.0.0.1' IDENTIFIED WITH 'mysql_native_password' BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';
FLUSH PRIVILEGES;
以上代码的意思是先创建一个全局user,接着授权给该用户slave权限。
在这里有一点需要特别注意: mysql8.0之后创建用户必须要选择一个加密方式,为了兼容以前的配置,建议大家使用mysql_native_password的加密方式。
登陆主服务器,执行
show master status;
查询master的状态,如下:
c.配置从服务器Slave
从数据库执行两条指令
change master to master_host='127.0.0.1',master_port=3307,master_user='repl',master_password='123456',master_log_file='master-bin.000002',master_log_pos=0;
start slave; // 启动服务复制功能
其中用户信息要求与自己创建时的用户信息一致,master_log_file的值就是show master status时查询到的file。
执行
show slave status\G // 查询从服务器状态
查看从数据库状态。
至此,mysql主从数据库配置成功了!