MYSQL一个设备上的主从复制实现-windows
只记录一次在一个设备上实现mysql主从复制的过程,很详细,建议收藏,用到的时候照着步骤做就可以,会记录所有需要注意到的细节和一些容易遇到的坑以及解决办法!
如果需要在同一台电脑(服务器)上实现mysql的主从复制备份,需要一个主数据库和一个从数据库。
本文使用的是mysql-5.6.39-winx64免安装版。安装版的也可以,需要自行找到安装生成的data所在目录以及my.ini文件位置。
因为在这之前我已经安装好了主数据库,本文只记录从数据库的安装过程,(主数据库也是个全新的,会记录所有的配置)。
主数据库端口号 port = 3307。
从数据库端口号 port = 3308 。
安装第二个从mysql:
找到第一个安装的mysql目录,完整的复制到另一个磁盘里(因为我的是免安装的,如果有安装包或者压缩包可以重新安装一个,我懒。)(我这里放到了一起,好操作,实际看情况为了好区分,我在后面加了后缀-copy
编辑copy数据库的my.ini:
basedir = E:\MYSQL\mysql-5.6.39-winx64-copy
datadir = E:\MYSQL\mysql-5.6.39-winx64-copy\data
port = 3308
添加环境变量:1、右击我的电脑-2、点击属性-3、点击高级系统设置-4、点击环境变量
在系统变量里添加两个数据库的变量,不添加的话两个mysql容易乱(两个mysql后面分别加了个1、2区分)
然后在系统变量里的PATH里追加两个变量值:
%MYSQL_HOME1%\bin %MYSQL_HOME2%\bin
将两个mysql注册成windows服务:
使用管理员命令窗口进入mysql安装目录下的bin目录里:
两个数据库分别操作输入服务安装命令:
(MYSQL2_copy 是服务名字,可以随意自定义)
E:\MYSQL\mysql-5.6.39-winx64-copy\bin\mysqld install MYSQL2_copy --defaults-file="E:\MYSQL\mysql-5.6.39-winx64-copy\my.ini"
(补充:移除服务的命令:mysqld remove MYSQL2_copy)
运行提示下面内容表示服务安装成功:
Service successfully installed.
可以进入服务页面查看(服务页面进入方法:右击我的电脑,点击管理,然后点击服务和应用下的服务即可):
启动mysql服务:
一:命令启动:
net start MYSQL1
二:服务列表启动(右击服务,点击启动)
修改主数据库的my.ini配置:
在[mysqld]标签下添加:
# 服务器id 可自定义 server-id = 3307 # 开启二进制日志 log-bin=mysql-bin log-bin-index=master-bin.index relay_log=mysql-relay-bin # 需要备份的数据库 binlog-do-db=test # 不需要备份的数据库 binlog-ignore-db=mysql
保存退出,重启主数据库服务
binlog-do-db用于指定需要同步的数据库,binlog-ignore-db指定不需要同步的数据库,如果这两个参数都不设置,则从服务器会复制主服务器的所有数据库
一般同步的话会新建一个专门用在该场景的用户,所以我们需要在主服务器上创建一个新的用户(如user_cp,密码123456)
方法如下:
打开管理员命令窗口,切换至主数据库目录下的bin目录下,用 root 账户连接MySQL主服务器(-u账号 -p密码)
mysql -uroot -proot --protocol=tcp --host=localhost --port=3307
创建新用户(@后面的ip地址为允许连接的客户端的ip地址。):
create user 'user_cp'@'127.0.0.1' identified by '123456';
给新用户配置主从复制的权限(@后面的ip地址为允许连接的客户端的ip地址,如果改为 '%',就表示客户端没有ip地址的限制):
grant replication slave on *.* to 'user_cp'@'127.0.0.1' identified by '123456';
刷新一下权限:
flush privileges;
如果主服务器中的数据库“test”中,已经有数据,我们需要先手动把主服务器中的数据复制到从服务器中,为了防止我们复制数据的时候,数据库中的test里的数据发生更新变化,我们可以先锁定数据库。
方法:
使用全局锁
flush tables with read lock;
这个命令是全局读锁定,它会给主服务器中的所有数据库都加上读锁,这里顺便说一下读锁和写锁的区别:
read lock(读锁):也叫共享锁,允许所有的读操作,但阻塞写操作,即所有连接只可以读数据,但不允许写数据。
write lock(写锁):也叫排它锁、独占锁,只允许当前连接的读和写,不允许其他并发的读操作和写操作。
锁定主服务器的数据库后,我们在从服务器中,也创建一个数据库test,并将所有的表(包括表结构和表数据)都导入。
然后,我们执行下面的命令,解锁:
unlock tables;
查看主服务器的master状态(记住列表中的File 和 Position的值,等会配置从服务器的时候需要用到):
show master status;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000013 | 497 | test | mysql | | +------------------+----------+--------------+------------------+-------------------+
从服务器配置:
修改从服务器的数据库配置文件E:\MYSQL\mysql-5.6.39-winx64-copy\my.ini:
[mysqld]标签下添加:
# 端口号
port = 3308
# 服务id 可自定义 server_id = 3308
# 开启二进制日志(从服务器不是必须要开启二进制日志)
log-bin=mysql-bin
保存退出,重启MySQL服务。
使用管理员命令窗口登录(常用的登录方式是mysql -u用户名 -p密码,但是因为一个设备有多个mysql需要指定端口号来登录,否则只会进入默认的3306端口服务器):
mysql -uroot -proot --protocol=tcp --host=localhost --port=3308
然后复制以下内容运行(需要修改里面的参数为自己服务器的信息):
change master to master_host='127.0.0.1',master_user='user_cp',master_password='123456',master_port=3307,master_log_file='mysql-bin.000013',master_log_pos=497;
参数详解:
master_host: 主服务器的IP
master_user: 主服务器上新创建的用户名
master_password: 用户的密码
master_port: 主服务器的端口,如果未曾修改,默认即可。
master_log_file: 主服务器二进制日志文件的名称,填写查看主服务器的master状态时显示的File的值
master_log_pos: 日志的位置,填写查看主服务器的master状态时显示的Position的值
启动从服务器的slave复制功能:
start slave;
停止主从复制功能:
stop slave;
查看从服务器的slave状态:
show slave status \G;
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: user_cp
Master_Port: 3307
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 819
Relay_Log_File: DESKTOP-IDKR9K2-relay-bin.000003
Relay_Log_Pos: 605
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes,则说明主从复制的所有配置已成功,即从服务器已经可以自动与主服务器的数据库数据实现同步了。
(如果是测试数据库的话可以自己测试一下,往主服务器执行几条添加修改等命令,看一下从服务器是否同步)
此后,只要主服务器的数据有更新(比如:在 test数据库中新建了一张表或者表中的数据发生了变化),从服务器都会自动与主服务器保持一致。但如果有人刻意改变了从服务器的数据,主服务器中的数据并不会同步更新,除非我们把这两个MySQL服务器设置为互为主从。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下
作者:博客园 - 凉年技术
出处:http://www.cnblogs.com/xxhxs-21/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
若内容有侵犯您权益的地方,请公告栏处联系本人,本人定积极配合处理解决。