原文:windows 系统本地做mysql 主从同步,最后面解决主从同步库名不一致,表结构一致
mysql主从同步的好处以及原理
之前看到很多新闻说某某的服务器奔溃,磁盘碎了,导致数据丢失。看到这里我们系统的服务器是不是也存在问题,如果数据一旦丢失,损失得有多大,就想到了 先做一个镜像吧,系统正在使用的叫做主库,再在另一个服务器上开一个库,配置成从库,这样,主库有变动从库会跟着变动,做到了事时实更新。
原理
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
如图
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
使用主从同步的好处:
- 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
- 提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
- 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
最后在上一张图,此图说一下mysql 主从复制的多种方式
图一
动手操作。
使用工具 mysql,Navicat Premium,一台装有win7系统的电脑。操作mysql最好使用工具,之前我使用的是cmd 进入操作,一直操作的是同一个mysql服务,我研究了好久。
第一步 是装mysql 服务(装mysql服务是可以用cmd),我用的是zip 的 安装方式,安装第一个的时候,我不在赘述,相信大家都会,但是我提醒一点,因为解压的mysql.zip后文件夹里面 都是my-default.ini这个文件 所以在做服务的时候最好把命令写全
如 : mysqld install mysql --defaults-file="d:\mysql\my-default.ini",
这样为了避免不必要的麻烦。这里我还有提醒一点下图红线圈的部分,有两点要注意:
1丶一个语法前面不能出现#号,井号相当于注释,所以就算配置了也不管用,
2丶红线圈的部分配置不能一样basedir、datadir 、port 、server_id ,一般mysql默认端口号3306。添加一个从服务器就重新配置这四个属性。
第一个mysql中my-default.ini 配置如图:
上图中的log-bin=mysql-bin 这个属性在主服务器中一定要配置。
主服务器配置完成启动就行了。
下面改装第二个mysql服务了。在装第二个mysql服务的时候。流程都是一样的。只需要进入相对应的mysql/bin 下面然后使用命令做成服务,启动服务就行
只是my-default.ini 上图中的,basedir、datadir 、port 、server_id四个配置改变了,至于log-bin=mysql-bin 属性可以加也可以不加。如果你想实现如图一中的主主复制,联级复制等或者其他功能 你可以加上不影响。
做成服务的命令也变了。变成
mysqld install mysql --defaults-file="E:\mysql5.6\my-default.ini"
一定不要搞错了红色的对应的mysql 的配置文件的位置。
如图:
操作完这些以后,下面的步骤不能直接使用cmd 来操作,一定记得用工具,因为直接在cmd 命令下操作,导致一直操作的是同一个mysql服务。
第二步配置主服务器:
我选择3306 的mysql当做 主服务器
1丶创建一个账户,并且授予主从同步的权限,一般不用root。
创建一个 user01的 账户 ,密码为123456。
CREATE USER 'user01'@'%' IDENTIFIED BY '123456';
授权
GRANT replication SLAVE ON *.* TO 'user01'@'127.0.0.%' IDENTIFIED BY '123456';
这里有一点要记得,用远程连接测试一下该账户是否能连接上。
2丶 就是把主服务器上的主表数据备份下来,我这里用的是test数据库操作。用Navicat把数据转储下来,不用细说。
3丶连接主服务器 锁表 FLUSH TABLES WITH READ LOCK;这样防止在做的时候数据改变了,导致脏数据,也为了防止,影响后的流程,下面一部再说
4丶SHOW MASTER STATUS; 执行该命令 这一步很关键,这也是为啥锁库的原因,执行这句命令一会有两个参数后面用,一个是File,一个是Position。一个是日志的名称,一个是日志的位置。下面在配置从服务器的时候会用到
第三步是配置从服务器:
三句命令
在这之前把Navicat从主服务器转储下来的数据倒入进来。
1丶
CHANGE MASTER TO MASTER_HOST = '127.0.0.1',
MASTER_PORT = 3306,
MASTER_USER = 'user01',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.000008',
MASTER_LOG_POS = 2817;
2丶start SLAVE;
3丶show slave status ;
如图显示就表示成功了。
可以测试在服务器更新数据从服务器会一起更新。
附录
我在开发过程中 遇到两个数据库表结构一样,但是我主服务器上的数据库叫做teset1 从服务器上叫做test2。而且我还有做到主服务器上可能还有其他的数据库,我并不能同步,如是我在主服务器上加这个配置binlog-do-db=tets1 从服务器上加
replicate-rewrite-db = tets1 -> test2,,实现主服务器上只有test1 库的数据同步到从服务器上的test2,但是保证test1和test2 结构一样