MySQL主从复制
主从复制:
通过日志的方式将数据从MySQL主服务器(Master)经过网络传送到MySQL从服务器(Slave)上,然后重放。
准备:两台主机做MySQL服务器
172.16.75.1 Master
172.16.75.2 Slave
拓扑图:
(一)配置:
Master:
[root@master ~]# vim /etc/my.cnf [mysqld] .... innodb_file_pertable=ON skip_name_resolve = ON log_bin=binlog server_id=199 sync_binlog=1 innodb_flush_log_at_trx_commit=1
开启服务:
[root@master ~]# systemctl start mariadb
参数解释:
innodb_file_pertable=ON:将每张表存储在单独的一个表文件中;
skip_name_resolve = ON :禁止域名解析(第一次建立连接时,IP和host name的映射关系已被缓存);
log_bin=binlog :开启二进制日志,日志文件默认存放在/var/lib/mysql目录下(路径可自定义);
server_id=199 :数据库服务器的ID ,不同的Mysql服务器ID设置为不同值;
sync_binlog=1 :一旦二进制日志文件有写入操作时,立即将变化的数据同步到磁盘;
innodb_flush_log_at_trx_commit=1 :当有事务提交时,数据写入二进制日志文件中,并同步到磁盘;
Slave:
[root@s lave ~]# vim /etc/my.cnf [mysqld] ... innodb_file_per_table = ON skip_name_resolve = ON server_id=200 read_only=ON relay_log=slavelog
开启服务:
[root@slave ~]# systemctl start mariadb
参数解释:
read_only=ON :只读
relay_log=slavelog :开启事务日志,作用:读取并复制保存Master服务器的二进制日志文件;
(二)将Master的数据内容全备份传送到Slave,保持两台服务器数据一致
Master:
[root@master ~]# mysqldump --all-databases --lock-all-tables > alldb.sql [root@master ~]# scp alldb.sql root@172.16.75.2:/root/
Slave: 将Master端传送来的数据进行重放
[root@slave ~]# mysql ... MariaDB [(none)]> \. alldb.sql
(三)
Master:
1. 授权一个用户复制权限并设置密码等;
2. 查看Master的状态信息即(日志文件和复制的位置)
MariaDB [(none)]> grant replication slave on *.* to 'west'@'172.16.%.%' identified by '111111';Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> show master status ;+---------------+----------+--------------+------------------+| File | Position| Binlog_Do_DB| Binlog_Ignore_DB|+---------------+----------+--------------+------------------+| binlog.000009| 548 | | |+---------------+----------+--------------+------------------+1 row in set (0.00 sec)
Slave:指定Master_user, 密码,端口,Master的二进制日志文件,复制开始时Master二进制日志文件的位置(从什么位置开始复制):
MariaDB [(none)]> change master to master_host='172.16.75.1',master_user='west',master_password='111111',master_port=3306,master_log_file='binlog.000009',master_log_pos=548;Query OK, 0 rows affected (0.04 sec)MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.01 sec)
查看Slave状态:
如图可看出Slave正在等待Master发送事件, Slave_IO_Running和Slave_SQL_Running两个线程已开启;
Slave_IO_Running作用:一旦Master二进制日志文件有变化时,Slave读取Master二进制日志并复制到中继日志中;
Slave_SQL_Running作用:将中继日志中的内容重放;测试:在Master端创建一个数据库,并在Slave端检测,看两端是否一致;
Master:
MariaDB [(none)]> create database teachers;
Slave:
主从复制完成;