主从同步的定义:
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
1.使用主从同步的好处:
(1) 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
(2) 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
(3) 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
2. 主从同步的机制
Mysql 服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。主服务器和每一个从服务器都必须配置一个唯一的 ID 号(在 my.cnf 文件的[mysqld]模块下有一个 server-id 配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO 语句来配置它要连接的主服务器的 ip 地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里)
3. 配置主从同步的基本步骤
有很多种配置主从同步的方法,可以总结为如下的步骤:
(1) 在主服务器上,必须开启二进制日志机制和配置一个独立的 ID
(2) 在每一个从服务器上,配置一个唯一的 ID,创建一个用来专门复制主服务器数据的账号
(3) 在开始复制进程前,在主服务器上记录二进制文件的位置信息
(4) 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用 mysqldump 导出数据库,或者直接复制数据文件)
(5) 配置从服务器要连接的主服务器的 IP 地址和登陆授权,二进制日志文件名和位置
4.我们将centos7中的mysql作为主服务器,win10的mysql作为从服务器,在开始前要保证centos7与win10可以ping通,(重要!)并且在centos7中开启3306端口,mysql默认端口号,改过的请自行开启改过的端口号。
在centos7中开启端口号的命令如下:
# 开启3306端口号
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 检查端口号状态
firewall-cmd --query-port=3306/tcp
5.备份主服务器(centos7)上的原有数据,新创建的数据库可忽略此步骤。
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql
-u :用户名
-p :密码
--all-databases :导出所有数据库
--lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改
~/master_db.sql :导出的备份数据(sql 文件)位置,可自己指定
6.在win10中将mysql数据库恢复
# 将数据库导出放在D盘
mysql -uroot -proot mydb < D:\master_db.sql
7.配置主服务器master
- 编辑设置 mysqld 的配置文件,设置 log_bin 和 server-id
- vim /etc/my.cnf 添加上下面两句
- server-id=3 (这个server-id尽量不要设置为1或2,这样的话我们在win上就不用改server-id了,因为有些windows上安装的mysql找不到my.ini文件)
log-bin=master-bin - 重启mysql并查看状态
-
# 重启mysql service mysqld restart # Redirecting to /bin/systemctl restart mysqld.service #查看状态 [root@vmproject_01 /]# service mysqld status Redirecting to /bin/systemctl status mysqld.service ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since 日 2018-12-16 21:24:05 CST; 59s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 8807 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS) Process: 8785 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 8810 (mysqld) Tasks: 27 Memory: 193.4M CGroup: /system.slice/mysqld.service └─8810 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysq...
- 登入主服务器 centos7中的 mysql,创建用于从服务器同步数据使用的帐号
-
# 登陆mysql mysql –uroot –pmysql #创建同步账号slave GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave'; # flush 一下,使其生效 FLUSH PRIVILEGES;
-
获取主服务器的二进制日志信息
-
mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000002 | 154 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
File 为使用的日志文件名字,Position 为使用的文件位置,这两个参数
须记下,配置从服务器时会用到。
8. 配置从服务器 slave(windows中的 MySQL)
- 因为我们在centos7中将server-id设置为3,所以可以直接登陆win10中mysql进行服务器的连接,否则你需要配置windows上mysql的my.ini文件,确保my.ini里面的server-id和centos7中mysql配置文件my.cnf中的server-id不同。
- 我们直接进入 windows 的 mysql,设置连接到 master 主服务器
-
mysql> change master to master_host='192.168.55.5', master_user='slave', -> master_password='slave',master_log_file='master-bin.000002', -> master_log_pos=154; Query OK, 0 rows affected, 2 warnings (0.03 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) 注: master_host:主服务器 centos 的 ip 地址 master_log_file: 前面查询到的主服务器日志文件名 master_log_pos: 前面查询到的主服务器日志文件位置
- 查看是否配置成功
- 验证!在centos7(主服务器)中添加一个数据库
- 在win10(从服务器中查看)
至centos7和win10之间的mysql数据库主从同步已经配置完成!
完毕!