网站必须要备案吗,有哪些网站可以做电子邀请函,如何自己学做网站,php做网站评价mysql设置主从复制模式似乎很容易#xff0c;关键在于1#xff09;主库启用二进制日志#xff0c;2#xff09;从库将主库设为主库。另外#xff0c;主从复制#xff0c;复制些什么#xff1f;从我现在获得的还很少的经验来看#xff0c;复制的内容有表#xff0c;用户…mysql设置主从复制模式似乎很容易关键在于1主库启用二进制日志2从库将主库设为主库。另外主从复制复制些什么从我现在获得的还很少的经验来看复制的内容有表用户用户权限推测其他像视图、存储过程、触发器、索引之类应该也会自动复制。
一、设置主从复制
为方便测试将mysql放在docker里跑创建了两个mysql容器一主一从
1、创建网络
创建一个docker网络主库和从库包括之后应用读写分离的proxysql都使用这个网络方便它们之间互相访问。
sudo docker network create mysql-tier --driver bridge2、创建主库
创建时将数据库文件、日志等挂载到宿主机万一删除了docker容器还可以方便地创建回来。
sudo docker run --name mysql-1 \
--network mysql-tier \
-p 3308:3306 \
--restartalways \
-v /home/admin/mysql1/mysql-files:/var/lib/mysql-files \
-v /home/admin/mysql1/conf:/etc/mysql \
-v /home/admin/mysql1/log:/var/log/mysql \
-v /home/admin/mysql1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORDdata2025 \
-d mysql:8.0.23 \
--server-id1 --log-binmysql-bin \
--lower_case_table_names1关键的一句
--server-id1 --log-binmysql-bin \3、创建从库
sudo docker run --name mysql-2 \
--network mysql-tier \
-p 3309:3306 \
--restartalways \
-v /home/admin/mysql2/mysql-files:/var/lib/mysql-files \
-v /home/admin/mysql2/conf:/etc/mysql \
-v /home/admin/mysql2/log:/var/log/mysql \
-v /home/admin/mysql2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORDdata2025 \
-d mysql:8.0.23 \
--server-id2 \
--lower_case_table_names1从库是2
--server-id2 \4、配置主从复制
1主库 进入主库容器里面创建一个用户专门用于复制
sudo docker exec -it mysql-1 /bin/bashmysql -uroot -pdata2025CREATE USER repl% IDENTIFIED WITH mysql_native_password BY 123456;GRANT REPLICATION SLAVE ON *.* TO repl%;FLUSH PRIVILEGES;展示一下主库信息这个信息很重要将用于配置从库。
SHOW MASTER STATUS;-------------------------------------------------------------------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-------------------------------------------------------------------------------
| mysql-bin.000003 | 826 | | | |
-------------------------------------------------------------------------------
1 row in set (0.00 sec)2从库 同样进入容器里面设置指向主库。注意里面用到的日志文件名称、起始位置都源自于上面获取的主库信息。
sudo docker exec -it mysql-2 /bin/bashmysql -uroot -pdata2025STOP SLAVE;CHANGE MASTER TO MASTER_HOSTmysql-1, -- 主库容器名称MASTER_USERrepl,MASTER_PASSWORD123456,MASTER_LOG_FILEmysql-bin.000003,MASTER_LOG_POS826,MASTER_PORT3306, -- 默认MySQL端口因为是在Docker网络内部通信MASTER_SSL0; -- 不使用SSLSTART SLAVE;SHOW SLAVE STATUS\G;红框内的属性应为 yes。
5、测试主从复制效果
1进入主库创建数据库表
sudo docker exec -it mysql-1 /bin/bashmysql -uroot -pdata2025create user work identified by 123456;create database testdb;grant all on testdb.* to work%;
grant all privileges on *.* to work%;use testdb;DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (ID int NOT NULL AUTO_INCREMENT COMMENT 唯一ID,NAME varchar(50) DEFAULT NULL COMMENT 名称,NOTE varchar(200) DEFAULT NULL COMMENT 备注,PRIMARY KEY (ID)
);2)进入从库看看是否已经同步过来
sudo docker exec -it mysql-2 /bin/bashmysql -uroot -pdata2025show databases;use testdb;呀成功了。
二、mysql的主从复制原理
主从复制的核心是基于 **二进制日志Binary Log**的传输和应用。整个过程可以分为以下几个阶段
(1) 主库记录二进制日志 当主库上发生数据变更操作时如插入、更新或删除MySQL 会将这些操作记录到二进制日志文件中。 二进制日志包含每一条事务的详细信息包括操作类型、执行时间、影响的表和数据等。
(2) 从库连接主库并拉取日志 从库通过一个称为**I/O 线程IO Thread**的线程连接到主库。 I/O 线程请求主库的二进制日志并将其内容复制到从库本地的一个临时文件中称为中继日志Relay Log。
(3) 从库应用日志 从库通过另一个称为**SQL 线程SQL Thread**的线程读取中继日志中的内容。 SQL 线程解析日志中的操作并逐一重放到从库的数据库中从而实现数据同步。 三、小结
主从复制的目的是为了读写分离降低并发压力提高性能。如何读写分离下回分解。