MySQL基础系列之 Windows主机上搭建主从复制

版权声明:如需转载,请注明出处。 https://blog.csdn.net/caiqing116/article/details/84995472

1.首先要在本地建立2个MySQL服务(版本5.5),指定不同的端口。我这里一个主(3306),一个从3308。
创建多个MySQL服务参考博文:https://blog.csdn.net/caiqing116/article/details/84899680
开门见山这里先创建测试库db_ssmdemo

CREATE DATABASE db_ssmdemo CHARACTER SET UTF8;

再创建测试表

CREATE TABLE `tb_basic_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
  `userId` varchar(32) DEFAULT NULL COMMENT '用户ID',
  `utype` int(1) DEFAULT '0' COMMENT '用户类型 0管理员1普通用户',
  `username` varchar(20) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT 'MD5加密密码',
  `headimg` varchar(200) DEFAULT NULL COMMENT '头像',
  `realname` varchar(20) DEFAULT NULL COMMENT '真实姓名',
  `sex` int(1) DEFAULT NULL COMMENT '性别',
  `age` int(2) DEFAULT NULL COMMENT '年龄',
  `mobile` varchar(20) DEFAULT NULL COMMENT '手机号',
  `email` varchar(50) DEFAULT NULL COMMENT '邮件地址',
  `credate` datetime DEFAULT NULL COMMENT '创建时间',
  `upddate` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

2.修改MySQL服务的主配置文件:
D:\softTool\MySQL\MySQL Server 5.5/my.ini

[mysqld]
#主库配置
server-id = 1    #服务id,不要出现重复
binlog-do-db=db_ssmdemo    #要同步的数据库,多个用英文逗号隔开
#binlog-ignore-db=mysql    #不同步的数据库,如果指定了binlog-do-db这里应该
log-bin=mysql-bin #要生成的二进制日记文件名称(可以不用指定的)

D:\softTool\MySQL\MySQL Server 5.5 slave3308/my.ini

[mysqld]
#从库配置
server-id = 3    #服务id,不要出现重复
replicate-do-db = db_ssmdemo    #要同步的数据库,多个用英文逗号隔开
replicate-ignore-db = mysql    #不同步的数据库
log-bin = mysql-bin #要生成的二进制日志文件名称(可以不用指定的)

从节点整体主要配置我全部贴出如下:

[client]
port=3308

[mysql]
default-character-set=utf8

[mysqld]
port=3308

#从库库配置
#服务id
server-id = 3
#要同步的数据库
replicate-do-db = db_ssmdemo
#不同步的数据库
replicate-ignore-db = mysql
#要生成的二进制日志文件名称
log-bin = mysql-bin

#Path to installation directory. All paths are usually resolved relative to this.
basedir="D:/softTool/MySQL/MySQL Server 5.5 slave3308/"

#Path to the database root
#数据目录
datadir="D:/softTool/MySQL/MySQL Server 5.5 slave3308 Data/"

# created and no character set is defined
character-set-server=utf8

# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# connection limit has been reached.
max_connections=160

# slowdown instead of a performance improvement.
query_cache_size=14M

# section [mysqld_safe]
table_cache=320
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=23M
key_buffer_size=20M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

#*** INNODB Specific options ***
# innodb引擎的共享表空间数据文件根目录
innodb_data_home_dir="D:/softTool/MySQL/MySQL Server 5.5 slave3308 Data/"
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=37M
innodb_log_file_size=10M
innodb_thread_concurrency=10

3、在主库添加一个用户 slaveroot3308并指定replication权限(用户名自定义)

GRANT REPLICATION SLAVE ON *.* TO 'slaveroot3308'@'从机数据库ip(不带端口号)' identified by '密码';

如:

GRANT REPLICATION SLAVE ON *.* TO 'slaveroot3308'@'192.168.100.104' identified by '123456'; 

附相关语句:
验证语句:SHOW GRANTS FOR 'slaveroot3308'@'192.168.100.104';
或:SELECT * FROM mysql.user WHERE user = 'slaveroot3308'
收回授权:REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'userName'@'host';
刷新授权:FLUSH PRIVILEGES
查看服务server-id是否相同:show variables like 'server_id';
查看服务uuid是否相同:show variables like '%server_uuid%';

4、保持主从MySQL的db_ssmdemo数据库初始状态一致。
一般是先将所有的表加读锁,然后copy磁盘上的数据库文件夹,或者直接停止服务,然后将数据文件拷贝过去。我这里的操作过程是

(1)先将主库锁表,防止数据插入:flush tables with read lock;
这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读。一般都是用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。

(2)将主库3306的需要同步的数据库所有数据备份然后还原到从库同步数据库中
此过程方法非常多,我就不在这里赘述了。

扫描二维码关注公众号,回复: 4536004 查看本文章

(3)在主数据库里面运行show master status;记下file和position字段对应的参数。

mysql> show master status;

在这里插入图片描述
(4)在从库设置它的master
如果之前有启动过则先slave stop;

mysql> 
change master to master_host='192.168.100.104',
master_port=3306,master_user='slaveroot3308',master_password='123456',
master_log_file='mysql-bin.000074',master_log_pos=667;

这里的master_log_file和master_log_pos对应刚才show master status记下的参数。
(5)slave start在从库开启从数据库复制功能;

mysql> slave start;

验证:可以在从库通过show slave status来查看一些参数判断主从是否正常搭建
在这里插入图片描述
如上图所示:Slave_IO_Running 和 Slave_SQL_Running 都是Yes说明搭建成功
(6)主库解锁unlock tables

5.操作主库插入数据查看从库是否同步了数据验证

INSERT INTO `tb_basic_user`
VALUES
	(
		'1','bc8bbfb770ee4f2c9ba0f988a7a92d4f','1','墨倾池',
		'E10ADC3949BA59ABBE56E057F20F883E',NULL,'云天望垂',NULL,
            '18',NULL,NULL,'2018-12-07 14:50:20',NULL
	);

分表查询主从库数据,可以看到从库也有数据了
在这里插入图片描述
在这里插入图片描述

6.注意点
(1)主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。

(2)如果主从的网络断开,从会在网络正常后,批量同步。

(3)如果对从库进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,比如在从库某张表新增了数据,主库新增数据的时候同步到从库,极有可能发生主键冲突,导致同步异常。所以这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。

猜你喜欢

转载自blog.csdn.net/caiqing116/article/details/84995472