我们在一个电脑上演示MySQL主从同步
首先下载或去复制两份MySQL,一个是主,一个是从,这里演示的是5.7的版本。
- 更改第一个主的MySQL的配置文件(my.ini):
主要更改其中框中的部分没有就加,路径和自己电脑mysql的路径对应
(注意:不要改到client那去了,引号无所谓)
[mysqld]
default-time-zone='+08:00'
#------------------------------------------------------------------------------
# 修改端口
port=3307
#打开二进制日志
log-bin=mysql-bin
#唯一id
server-id=1
#打开日志记录
general-log=1
log-output=FILE
general-log-file="D:\MysqlJiQun\mysql-master\master.log"
# 设置mysql的安装目录
basedir=D:\MysqlJiQun\mysql-master
# 设置mysql数据库的数据的存放目录
datadir=D:\MysqlJiQun\mysql-master\data
#------------------------------------------------------------------------------
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
然后把这个服务注册一下:
在bin目录下运行cmd(注意:要以管理员运行,否则会失败):
mysqld --install master --defaults-file="D:\MysqlJiQun\mysql-master\my.ini"
注册成功后:在进行初始化(注意:查看data目录下,确保没有任何文件,有就干掉):
mysqld --initialize
等待初始化完毕后,启动服务:
net start master
如果在data目录下找到生成的.err文件,并找到下面这段话获取密码:(加粗的就是密码)
[Note] A temporary password is generated for root@localhost: JwtT&tu%b5=N
用这个密码去登录mysql(如果有多个mysql,就指定一下端口):
mysql -u root -P 3307 -h 127.0.0.1 -p
需要更改密码(在mysql登录状态):
set password for root@localhost = password('新密码');
第一个主mysql就弄好了:
查看data下面是否有mysql-bin.000001的文件,这就是我们要进行主从同步的关键。
- 第二个从的MySQL配置文件
和上面差不多的操作步骤,也是注册一个mysql,路径不同,端口不同:
[mysqld]
default-time-zone='+08:00'
#------------------------------------------------------------------------
# 修改端口
port=3308
#打开二进制日志
log-bin=mysql-bin
#唯一id
server-id=10
#打开日志记录
general-log=1
log-output=FILE
general-log-file="D:/MysqlJiQun/mysql-slave/slave.log"
# 设置mysql的安装目录
basedir=D:\MysqlJiQun\mysql-slave
# 设置mysql数据库的数据的存放目录
datadir=D:\MysqlJiQun\mysql-slave\data
#------------------------------------------------------------------------
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
注册服务的方式一样,注意点也是。
- 两个MySQL都注册完成,并都可以访问,进行主从同步:
然后在Navicat中连接两个mysql:
在master主的连接上随便创建一个数据库,打开查询:
运行这一句SQL,表示授权一个wltest用户 密码是admin的访问权限:
GRANT REPLICATION SLAVE ON *.* to 'wltest'@'127.0.0.1'IDENTIFIED by 'admin';
在运行SQL,获取数据库的位置(Position的值):
show master status;
在slave从的连接上随便创建一个数据库,打开查询:
运行一下SQL,注意修改
CHANGE master to
master_host='127.0.0.1', #master的ip地址
master_user='wltest', #master授权的用户名
master_password='admin', #master授权的密码
master_port=3307, #master的端口
master_log_file='mysql-bin.000001', #master的data目录下的二进制文件名
master_log_pos=636; #刚刚获取的数据库位置
如果有问题,就运行:stop slave;
再执行上述sql语句。
最后重启slave服务(必须重启才能生效);
重启后运行SQL:show slave status;
看到以下效果说明已生效:
测试:
在master的连接中创建一个新的数据库,查看slave,出现同步的数据库;
新建一张表,查看slave,出现同步的表。
新插入一条数据,查看slave,出现同步的表。