Windows下MySql主从配置实战教程
MySql的主从配置教程
主库MySql的安装
1、MySQL的下载
2、MySQL配置文件的编写
3、初始化数据库
4、安装服务
5、启动MySql
6、登录MySQL,修改密码
从库1MySql的安装
1、MySQL的下载
2、MySQL配置文件的编写
3、初始化数据库
4、安装服务
5、启动MySQL
6、重置密码
从库2MySql的安装
1、MySQL的下载
2、MySQL配置文件的编写
3、初始化数据库
4、安装服务
5、启动MySQL
6、重置密码
关联主库与从库
在主机上面操作
1、在主库(master)中创建一个用户用户与从库同步的用户名和密码,并授权。
2、在从库上操作
- 为什么要做主从复制
- 在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
- 做数据的热备
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
- Mysql主从复制的原理
- binlog,主库中保存更新事件日志的二进制文件。
主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。如果过期时间是10d的话,那么就是最近10d的数据库修改记录。
mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。
在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到主库时,从主库拉取过来进行复制操作的数据源。
- binlog输出线程
每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。
在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。
- 从库I/O线程
当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。 - 从库的SQL线程
从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
主库MySql的安装
1、MySQL的下载
将下好的MySQL存放在D盘中,所有文件内容如下:
2、MySQL配置文件的编写
在当前目录下新建my.ini文件,内容如下
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# master服务唯一标识
server-id=1
# master-bin是一个存放二进制log文件的路径,我这里指定了一个mysql当前安装目录的mysql-bin文件夹
# 开启二进制日志
log_bin=master-bin
log_bin-index=master-bin.index
# binlog-do-db=需要同步的数据库名(多个数据库重复设置即可)
binlog-do-db=skysso
# 动清理30天之前的log文件(可自由指定时间)
expire_logs_days=30
# 设置3307端口
port=3307
character_set_server=utf8
# 设置mysql的安装目录
basedir="D:/mysql-master/"
# 设置mysql数据库的数据的存放目录
datadir="D:/mysql-master/data/"
# 允许最大连接数
max_connections=100
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
3、初始化数据库
(管理员权限)切换到bin目录下:
D:\mysql-master\bin>mysqld --initialize --user=mysql --console
2019-04-12T07:29:19.960548Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:29:22.760708Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:29:23.446747Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:29:23.706762Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: b1d8cfad-5cf4-11e9-8de2-7845c41512c0.
2019-04-12T07:29:23.718763Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:29:23.751765Z 1 [Note] A temporary password is generated for root@localhost: .Yx79bCq.YCe
4、安装服务
mysqld --install mysql-master --defaults-file=“D:\mysql-master\my.ini”
就是将mysql-master加入service服务中,以后启动的时候只需要通过net start
mysql-master命令就行。同理,关闭服务的时候只要使用net stop mysql-master.
5、启动MySql
net start mysql-master
6、登录MySQL,修改密码
mysql -uroot -p -P3307
set password for root@localhost = password('root');
从库1MySql的安装
1、MySQL的下载
2、MySQL配置文件的编写
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 服务唯一标识
server-id=2
# master-bin是一个存放二进制log文件的路径,我这里指定了一个mysql当前安装目录的mysql-bin文件夹
# 开启二进制日志
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
# 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,
# 则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性
relay_log_recovery=1
# 只读模式(普通用户)
read_only=1
# 只读模式(超级管理员)
super_read_only=1
# binlog-do-db=需要同步的数据库名(多个数据库重复设置即可)
binlog-do-db=skysso
# 动清理30天之前的log文件(可自由指定时间)
expire_logs_days=30
# 设置3308端口
port=3308
character_set_server=utf8
# 设置mysql的安装目录
basedir="D:/mysql-slave/"
# 设置mysql数据库的数据的存放目录
datadir="D:/mysql-slave/data/"
# 允许最大连接数
max_connections=100
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
3、初始化数据库
mysqld --initialize --user=mysql --console
2019-04-12T07:49:10.739657Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:49:13.819833Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:49:14.471870Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:49:14.703883Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 77bcae4a-5cf7-11e9-a628-7845c41512c0.
2019-04-12T07:49:14.715884Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:49:14.737885Z 1 [Note] A temporary password is generated for root@localhost: r29Pq!Ic1uZR
4、安装服务
mysqld --install mysql-slave3308 --defaults-file="D:\mysql-slave\my.ini"
5、启动MySQL
net start mysql-slave3308
6、重置密码
mysql -uroot -p -P3308
set password for root@localhost=password('root');
从库2MySql的安装
1、MySQL的下载
2、MySQL配置文件的编写
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 服务唯一标识
server-id=2
# master-bin是一个存放二进制log文件的路径,我这里指定了一个mysql当前安装目录的mysql-bin文件夹
# 开启二进制日志
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
# 设置3308端口
port=3308
character_set_server=utf8
# 设置mysql的安装目录
basedir="D:/mysql-slave/"
# 设置mysql数据库的数据的存放目录
datadir="D:/mysql-slave/data/"
# 允许最大连接数
max_connections=100
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
3、初始化数据库
mysqld --initialize --user=mysql --console
2019-04-12T07:49:10.739657Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:49:13.819833Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:49:14.471870Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:49:14.703883Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 77bcae4a-5cf7-11e9-a628-7845c41512c0.
2019-04-12T07:49:14.715884Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:49:14.737885Z 1 [Note] A temporary password is generated for root@localhost: r29Pq!Ic1uZR
4、安装服务
mysqld --install mysql-slave3308 --defaults-file="D:\mysql-slave\my.ini"
5、启动MySQL
net start mysql-slave3308
6、重置密码
mysql -uroot -p -P3308
set password for root@localhost=password('root');
关联主库与从库
在主机上面操作
1、在主库(master)中创建一个用户用户与从库同步的用户名和密码,并授权。
# 创建有复制权限的账号
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'backdb'@'%' IDENTIFIED BY 'root';
# 查看主库状态(记录File、Position、Binlog_Do_DB的值)
show master status;
# 查看big-log日志是否开启成功
show variables like '%log_bin%';
2、在从库上操作
# 查看从库状态(Slave_IO_State、Slave_IO_Runing、Slave_SQL_Runing这三个参数很重要)
show SLAVE STATUS;
# 关联主库和从库(操作之时主库停止操作,还得先关闭主从同步)相关的参数在主库中执行`show master status`命令中获取
change master to
master_host='主库IP地址',
master_port=主库端口,
master_user='主库用户名',
master_password='主库用户密码',
master_log_file='要同步的文件名称',
master_log_pos=要开始同步的位置;
# 关闭主从同步
stop slave;
# 重置主从同步信息
reset slave;
# 开启主从同步
start slave
参考连接 :
MySql主从配置实战教程 : https://mp.weixin.qq.com/s/OSTaRJJz8y-t3_EyP38dqg