前言:
主从数据库能同步主库的内容,可以做备份和分离读写作用。主库生成log和dump日志线程,从库生成I/O线程和SQL线程,进行复制和读写。
一、环境准备
1、主库只要一个,从库可以有三四个。在做主从的时候,要使所有用户不能写入数据库,只给读的权限,所有提前创建需要的用户和数据。
2、master:192.168.121.200:master.example.com做主库
salve:192.168.121.100:slave.example.com做从库。
数据库内容一致,双方都要上锁。从库不用,主库需要。
3、关掉防火墙和selinux,做时间同步。可以相互通信做远程登录。远程登录需要时间一致。
二、实验步骤
创建可以复制内容的用户repl1后面要用到,上锁,全量备份数据库到slave端。配置文件。
2.1、设置从库的数据库文件,mysql的搭建前面有
[root@slave ~]# vim /etc/my.cnf 从库开启日志功能
[mysqld] //随便命名
basedir = /usr/local/mysql //工作目录
datadir = /opt/data //存放数据的目录
socket = /tmp/mysql.sock //指针,用于决定使用哪个数据库
port = 3306 //端口号
pid-file = /opt/data/mysql.pid //进程文件
user = mysql //定义的程序用户
skip-name-resolve //跳过主机名
server-id = 2 //标识id号大于主库,越小越优先
relay-log = mysql-relay-bin //启用中继日志relay-log,复制功能
symbolic-links = 0 //不启动软连接(符号连接)
log-error = /var/log/mysqld.log //填写错误日志文件
[root@slave ~]# systemctl restart mysqld
2.2、设置主库的配置文件
[root@master ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log-bin = mysql-bin //启用binlog日志
server-id = 1 //数据库服务器唯一标识符,主库的server-id值必须比从库的小
symbolic-links = 0
log-error = /var/log/mysqld.log
[root@master ~]# systemctl restart mysqld.service
mysql> create user 'repl1'@'192.168.121.100' identified by '123';
[root@mysql ~]# mysqldump -uroot -p123 --all-databases > /opt/all-20240806.sql 全量备份主库的内容
[root@mysql ~]# scp /opt/all-20240806.sql root@192.168.121.100:/opt/ 复制数据库所有的内容给从库
mysql> grant replication slave on *.* to 'repl1'@'192.168.121.100'; 给repl1用户复制的权限,给从库登录使用
mysql> flush privileges; 刷新权限
mysql> flush tables with read lock; 上锁,不能写,只能读
mysql> show master status; 查看日志文件名字和pos值,后面设置从库的时候要使用
将数据传给slave主机
[root@slave ~]# mysql -uroot -p123 < /opt/all-20240806.sql
mysql> change master to master_host='192.168.121.200', //连接主库
-> master_user='repl1', //用户用repl1
-> master_password='123', //repl1的密码是123
-> master_log_file='mysql-bin.000001', //查看主库的日志文件mysql-bin.000001
-> master_log_pos=154; //pos号为154
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave; 启动从库设置
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status /G; 查看两个线程都为yes,主从设置成功大写的g,为竖着看
三、测试
3.1、主库插入数据
mysql> exit; 退出锁
[root@master ~]# mysql -uroot -p123
insert into student values(23,'ll',19,'man',198,5); 在主库插入一条数据
3.2、从库查看到数据同步
[root@slave ~]# mysql -uroot -p
mysql> use student;
mysql> select * from student; //查看主从设置成功
扩展:
在从库插入的数据,主库不会同步。在主库插入从库中已有的数据,从库会显示两条一模一样的数据。均不会报错,如果主库做了唯一约束,主库插入相同数据时,不会报错,从库SQL进程出现错误,从库失效。删除从库多余的内容,重启从库服务就行了。