From a4502b2d8e50582721c8c78ed4a8ff7cb45c8001 Mon Sep 17 00:00:00 2001 From: kongziyu <2262843700@qq.com> Date: Wed, 4 Sep 2024 09:42:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 第五章:权限管理及数据备份与恢复.md | 1228 ++++++++++++++++++++++ 第六章:主从复制及读写分离.md | 1501 +++++++++++++++++++++++++++ 第四章:数据库日志管理.md | 135 +++ 3 files changed, 2864 insertions(+) create mode 100644 第五章:权限管理及数据备份与恢复.md create mode 100644 第六章:主从复制及读写分离.md create mode 100644 第四章:数据库日志管理.md diff --git a/第五章:权限管理及数据备份与恢复.md b/第五章:权限管理及数据备份与恢复.md new file mode 100644 index 0000000..627605b --- /dev/null +++ b/第五章:权限管理及数据备份与恢复.md @@ -0,0 +1,1228 @@ +

权限管理及数据备份与恢复

+ +**作者:行癫(盗版必究)** + +------ + +## 一:权限管理 + +#### 1.权限级别 + +​ Global level:系统级,所有库,所有表的权限 + +​ Database level:某个数据库中的所有表的权限 + +​ Table level:库中的某个表的权限 + +​ Column level:表中的某个字段的权限 + +​ procs level:某个存储过程的权限 + +​ proxies level:代理服务器的权限 + +#### 2.查看权限记录表 + +​ 因为超级管理员默认已经设置;所以直接查询权限即可 + +##### Global level + +``` + mysql> select * from mysql.user\G +*************************** 1. row *************************** + Host: localhost + User: root + Select_priv: Y + Insert_priv: Y + Update_priv: Y + Delete_priv: Y + Create_priv: Y + Drop_priv: Y + Reload_priv: Y + Shutdown_priv: Y + Process_priv: Y + File_priv: Y + Grant_priv: Y + References_priv: Y + Index_priv: Y + Alter_priv: Y + Show_db_priv: Y + Super_priv: Y + Create_tmp_table_priv: Y + Lock_tables_priv: Y + Execute_priv: Y + Repl_slave_priv: Y + Repl_client_priv: Y + Create_view_priv: Y + Show_view_priv: Y + Create_routine_priv: Y + Alter_routine_priv: Y + Create_user_priv: Y + Event_priv: Y + Trigger_priv: Y +Create_tablespace_priv: Y + ssl_type: + ssl_cipher: + x509_issuer: + x509_subject: + max_questions: 0 + max_updates: 0 + max_connections: 0 + max_user_connections: 0 + plugin: mysql_native_password + authentication_string: *B1DD4ADE47888D9AEC4D705C85230F1B52D2A817 + password_expired: N + password_last_changed: 2022-09-25 14:44:38 + password_lifetime: NULL + account_locked: N +``` + +字段介绍: + +```shell +用户字段:root +权限字段:Select_priv +安全字段:*B1DD4ADE47888D9AEC4D705C85230F1B52D2A817 + +Select_priv:查询权限 +Insert_priv:插入权限 +Update_priv:更新权限 +Delete_priv:删除权限 +...... +``` + +##### Database level + +```shell +mysql> select * from mysql.db\G; +*************************** 1. row *************************** + Host: localhost + Db: performance_schema + User: mysql.session + Select_priv: Y + Insert_priv: N + Update_priv: N + Delete_priv: N + Create_priv: N + Drop_priv: N + Grant_priv: N + References_priv: N + Index_priv: N + Alter_priv: N +Create_tmp_table_priv: N + Lock_tables_priv: N + Create_view_priv: N + Show_view_priv: N + Create_routine_priv: N + Alter_routine_priv: N + Execute_priv: N + Event_priv: N + Trigger_priv: N +``` + +测试库权限: + +```shell +mysql> create database t1; +Query OK, 1 row affected (0.00 sec) + +mysql> grant all on t1.* to 't1'@'localhost' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) +``` + +查看: + +``` +mysql> select * from mysql.db\G +*************************** 3. row *************************** + Host: localhost + Db: t1 + User: t1 + Select_priv: Y + Insert_priv: Y + Update_priv: Y + Delete_priv: Y + Create_priv: Y + Drop_priv: Y + Grant_priv: N + References_priv: Y + Index_priv: Y + Alter_priv: Y +Create_tmp_table_priv: Y + Lock_tables_priv: Y + Create_view_priv: Y + Show_view_priv: Y + Create_routine_priv: Y + Alter_routine_priv: Y + Execute_priv: Y + Event_priv: Y + Trigger_priv: Y +3 rows in set (0.00 sec) +``` + +验证: + +```shell +[root@xingdian ~]# mysql -u t1 -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| t1 | ++--------------------+ +2 rows in set (0.00 sec) + +``` + +##### Table level + +```shell +mysql> select * from mysql.tables_priv\G; +*************************** 1. row *************************** + Host: localhost + Db: mysql + User: mysql.session + Table_name: user + Grantor: boot@connecting host + Timestamp: 0000-00-00 00:00:00 + Table_priv: Select +Column_priv: +*************************** 2. row *************************** + Host: localhost + Db: sys + User: mysql.sys + Table_name: sys_config + Grantor: root@localhost + Timestamp: 2022-09-25 14:40:58 + Table_priv: Select +Column_priv: +2 rows in set (0.00 sec) +``` + +创建库表验证: + +```shell +mysql> create database t2; +Query OK, 1 row affected (0.00 sec) + +mysql> use t2; +Database changed +mysql> create table u1(id int); +Query OK, 0 rows affected (0.01 sec) + +mysql> insert into u1 values (1); +Query OK, 1 row affected (0.01 sec) + +mysql> grant all on t2.u1 to 't2'@'localhost' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> create table u2(id int); +Query OK, 0 rows affected (0.01 sec) + +mysql> show tables; ++--------------+ +| Tables_in_t2 | ++--------------+ +| u1 | +| u2 | ++--------------+ +2 rows in set (0.00 sec) +``` + +权限查看: + +```shell +mysql> select * from mysql.tables_priv\G; +*************************** 3. row *************************** + Host: localhost + Db: t2 + User: t2 + Table_name: u1 + Grantor: root@localhost + Timestamp: 0000-00-00 00:00:00 + Table_priv: Select,Insert,Update,Delete,Create,Drop,References,Index,Alter,Create View,Show view,Trigger +Column_priv: +3 rows in set (0.00 sec) +``` + +验证:(登录t2账户,看到u1表,看不到u2代表权限成功) + +```shell +[root@xingdian ~]# mysql -u t2 -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 6 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| t2 | ++--------------------+ +2 rows in set (0.00 sec) + +mysql> use t2; +Reading table information for completion of table and column names +You can turn off this feature to get a quicker startup with -A + +Database changed +mysql> show tables; ++--------------+ +| Tables_in_t2 | ++--------------+ +| u1 | ++--------------+ +1 row in set (0.00 sec) +``` + +##### Column level + +```shell +[root@xingdian ~]# mysql -uroot -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 7 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> select * from mysql.columns_priv\G; +Empty set (0.00 sec) + +mysql> insert into mysql.columns_priv(host,db,user,table_name,column_name,column_priv) values('%','t2','t2','u1','id','select'); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from mysql.columns_priv\G; +*************************** 1. row *************************** + Host: % + Db: t2 + User: t2 + Table_name: u1 +Column_name: id + Timestamp: 2022-09-25 15:34:05 +Column_priv: Select +1 row in set (0.00 sec) +``` + +注意: + +​ 前提是有库,有表,有权限 + +## 二:用户管理 + +#### 1.登录和退出 + +```shell +[root@xingdian ~]# mysql -h 192.168.18.160 -P 30042 -u root -pmysql -e "show databases;" +[root@xingdian ~]# mysql -h 192.168.18.160 -P 30042 -u root -pmysql mysql -e "show tables;" + + -h 指定主机名 【默认为localhost】 + -P MySQL服务器端口 【默认3306】 + -u 指定用户名 【默认root】 + -p 指定登录密码 【默认为空密码】 + 此处mysql为指定登录的数据库 + -e 接SQL语句 (在脚本中使用) + +``` + +#### 2.创建用户 + +方式一: + +```shell +mysql> create user xingdian; +ERROR 1819 (HY000): Your password does not satisfy the current policy requirements +注意: + 该报错是因为密码强度问题,取消密码强度即可创建用户 + +mysql> create user xingdian@'%' identified by 'QianFeng@123'; +Query OK, 0 rows affected (0.00 sec) +``` + +方式二: + +```shell +mysql> grant all on *.* to 'diange'@'localhost' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) +``` + +注意: + +​ 该方式采用授权的方式 + +​ ALL 所有权限 select 单独某一个权限(多个权限用逗号隔开) + +```shell +mysql> grant select on *.* to 'dianye'@'localhost' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) +``` + +```shell +*.* 所有的库所有的表 也可以单独某一个库某一个表 +``` + +```shell +xingdian@localhost 用户有则授权无则创建 localhost % 10.19.40.% 10.19.40.11 +``` + +#### 3.删除用户 + +方式一: + +```shell +MySQL [(none)]> Drop user xingdian@'%'; +Query OK, 0 rows affected (0.00 sec) +``` + +方法二: + +```shell +MySQL [(none)]> delete from mysql.user where user='diandian' AND Host='%'; +Query OK, 1 row affected (0.00 sec) +``` + +#### 4.修改密码 + +方式一: + +```shell +[root@xingdian ~]# mysqladmin -uroot -p'123' password 'new_password' //123为旧密码 +``` + +方式二: + +```shell +MySQL [(none)]> update mysql.user set authentication_string=password(123456) where user='diange' And Host='%'; +``` + +注意: + +​ 刷新授权表后生效:flush privileges + +自己设置自己密码: + +```shell +MySQL [(none)]> set password='123'; +Query OK, 0 rows affected (0.00 sec) +``` + +root用户修改其他用户密码: + +方法一: + +```shell +mysql> SET PASSWORD FOR user3@'localhost'='new_password'; +``` + +方法二: + +```shell +UPDATE mysql.user SET authentication_string=password('new_password') WHERE user='user3' AND host='localhost'; +``` + +#### 5.查看密码策略 + +```shell +mysql> SHOW VARIABLES LIKE 'validate_password%'; ++--------------------------------------+--------+ +| Variable_name | Value | ++--------------------------------------+--------+ +| validate_password_check_user_name | OFF | +| validate_password_dictionary_file | | +| validate_password_length | 8 | +| validate_password_mixed_case_count | 1 | +| validate_password_number_count | 1 | +| validate_password_policy | MEDIUM | +| validate_password_special_char_count | 1 | ++--------------------------------------+--------+ +7 rows in set (0.00 sec) +``` + +参数解释: + +​ validate_password_dictionary_file 指定密码验证的文件路径 + +​ validate_password_length 密码最小长度 + +​ validate_password_mixed_case_count 密码至少要包含的小写字母个数和大写字母个数 + +​ validate_password_number_count 密码至少要包含的数字个数 + +​ validate_password_policy 密码强度检查等级,对应等级为:0/LOW、1/MEDIUM、2/STRONG,默认为1 + +​ 0/LOW:只检查长度 + +​ 1/MEDIUM:检查长度、数字、大小写、特殊字符 + +​ 2/STRONG:检查长度、数字、大小写、特殊字符字典文件 + +​ validate_password_special_char_count密码至少要包含的特殊字符数 + +修改密码策略: + +```shell +mysql> SHOW VARIABLES LIKE 'validate_password%'; ++--------------------------------------+--------+ +| Variable_name | Value | ++--------------------------------------+--------+ +| validate_password_check_user_name | OFF | +| validate_password_dictionary_file | | +| validate_password_length | 8 | +| validate_password_mixed_case_count | 1 | +| validate_password_number_count | 1 | +| validate_password_policy | MEDIUM | +| validate_password_special_char_count | 1 | ++--------------------------------------+--------+ +7 rows in set (0.00 sec) + +mysql> set global validate_password_length=4; +Query OK, 0 rows affected (0.00 sec) + +mysql> SHOW VARIABLES LIKE 'validate_password%'; ++--------------------------------------+--------+ +| Variable_name | Value | ++--------------------------------------+--------+ +| validate_password_check_user_name | OFF | +| validate_password_dictionary_file | | +| validate_password_length | 4 | +| validate_password_mixed_case_count | 1 | +| validate_password_number_count | 1 | +| validate_password_policy | MEDIUM | +| validate_password_special_char_count | 1 | ++--------------------------------------+--------+ +7 rows in set (0.00 sec) +``` + +关闭密码策略: + +``` +修改配置文件,添加以下参数: +validate_password=off +``` + +## 三:数据备份及恢复 + +#### 1.概述 + +​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 + +备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 + +冗余: 数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备模式、数据库集群 + +备份考虑的因素: + +​ 数据的一致性 + +​ 服务的可用性 + +分类: + +​ 逻辑备份 + +​ 备份的是建表、建库、插入等操作所执行SQL语句;适用于中小型数据库,效率相对较低(mysqldump) + +​ 物理备份 + +​ 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本(tar、xtrabackup) + +备份方式分类: + +​ 完全备份 + +​ 备份所有数据 + +​ 增量备份 + +​ 每次备份上一次备份到现在产生的新数据 + +image-20220925184632820 + +​ 差异备份 + +​ 只备份跟完整备份不一样的 + + + +#### 2.tar备份 + +​ 注意:备份期间,服务不可用 + +备份过程:完全物理备份 + +​ 停止数据库 + +```shell +[root@xingdian ~]# systemctl stop mysqld +``` + +​ tar备份数据 + +```shell +[root@xingdian ~]# mkdir /backup +[root@xingdian ~]# cd /var/lib/mysql +[root@xingdian ~]# tar -zcvf /backup/`date +%F`-mysql-all.tar.gz ./* +``` + +​ 启动数据库(备份完成后启动数据库,继续为其他服务提供服务) + +```shell +[root@xingdian ~]# systemctl start mysqld +``` + +恢复过程:模拟数据丢失,恢复数据 + +​ 停止数据库 + +```shell +[root@xingdian ~]# systemctl stop mysqld +``` + +​ 清理环境 + +```shell +[root@xingdian ~]# rm -rf /var/lib/mysql/* +``` + +​ 导入备份数据 + +```shell +[root@xingdian ~]# tar -xvf /backup/2019-08-20-mysql-all.tar.gz -C /usr/lib/mysql +[root@xingdian ~]# chown mysql.mysql /var/lib/mysql/* -R +``` + +​ 启动数据库(恢复后验证数据是否恢复成功) + +```shell +[root@xingdian ~]# systemctl start mysqld +``` + +#### 3.xtrabackup备份 + +简介: + +​ percona-xtrabackup是开源免费的支持MySQL 数据库热备份的软件;能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份;它不暂停服务创建Innodb热备份;为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载 + +![image-20220925185829126](https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220925185829126.png) + +安装软件: + +```shell +[root@xingdian ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y +[root@xingdian ~]# yum install percona-xtrabackup-24 -y +``` + +##### 完整备份 + +​ 创建备份目录: + +```shell +[root@xingdian ~]# mkdir -p /xtrabackup/full/ +``` + +​ 备份: + +```shell +[root@xingdian ~]# innobackupex --user=root --password='QianFeng@123' /xtrabackup/full/ +``` + +​ 查看备份数据: + +```shell +[root@xingdian ~]# ls /xtrabackup/full/ +2022-09-25_19-40-47 +``` + +​ 模拟数据丢失数据恢复:(以下操作模拟数据丢失) + +丢失前数据库中的数据: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 7 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| sys | +| t1 | ++--------------------+ +5 rows in set (0.00 sec) +``` + +数据丢失: + +```shell +[root@xingdian ~]# systemctl stop mysqld +[root@xingdian ~]# rm -rf /var/lib/mysql/* +[root@xingdian ~]# rm -rf /var/log/mysqld.log +[root@xingdian ~]# rm -rf /var/log/mysql-slow/slow.log (有则删除,无则不需要操作) +``` + +​ 恢复前的验证: + +```shell +[root@xingdian ~]# innobackupex --apply-log /xtrabackup/full/2022-09-25_19-40-47/ +``` + +​ 恢复之前需要确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里 + +```shell +[root@xingdian ~]# cat /etc/my.cnf +datadir=/var/lib/mysql +``` + +​ 恢复数据: + +```shell +[root@xingdian ~]# innobackupex --copy-back /xtrabackup/full/2022-09-25_19-40-47/ +``` + +​ 修改权限: + +```shell +[root@xingdian ~]# chown mysql.mysql /var/lib/mysql -R +``` + +​ 启动服务: + +```shell +[root@xingdian ~]# systemctl start mysqld +``` + +​ 验证: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| sys | +| t1 | ++--------------------+ +5 rows in set (0.00 sec) +``` + +##### 增量备份 + +原理:每次备份上一次备份到现在产生的新数据 + +注意:在进行增量备份前先进行完整备份 + +案例:周一进行全备,周二到周天进行增量备份 + +​ 完整备份:(周一) + +```shell +[root@xingdian ~]# innobackupex --user=root --password='QianFeng@123' /xtrabackup/full +``` + +​ 创建增量备份存放数据目录: + +```shell +[root@xingdian ~]# mkdir /xtrabackup/zeng -p +``` + +​ 模拟数据增加(略) + +​ 第一次增量备份:(周二) + +```shell +[root@xingdian ~]# innobackupex --user=root --password='QianFeng@123' --incremental /xtrabackup/zeng/ --incremental-basedir=/xtrabackup/full/2022-09-25_19-40-47/ + +第一次增量备份的数据: +[root@xingdian ~]# ls /xtrabackup/zeng/ +2022-09-25_19-56-00 +``` + +​ 模拟数据增加(略) + +​ 第二次增量备份:(周三) + +```shell +[root@xingdian ~]# innobackupex --user=root --password='QianFeng@123' --incremental /xtrabackup/zeng/ --incremental-basedir=/xtrabackup/zeng/2022-09-25_19-56-00/ + +第二次增量备份的数据: +[root@xingdian ~]# ls /xtrabackup/zeng/ +2022-09-25_19-56-00 2022-09-25_19-58-12 +``` + +​ 后面的增量备份重复上面的操作(略) + +增量备份数据恢复流程:(需要模拟数据的丢失) + +​ 停止数据库: + +```shell +[root@xingdian ~]# systemctl stop mysqld +``` + +​ 删除数据: + +```shell +[root@xingdian ~]# rm -rf /var/lib/mysql/* +[root@xingdian ~]# rm -rf /var/log/mysqld.log + +其他数据根据实际情况删除 +``` + +​ 依次重演回滚: + +```shell +全备回滚: +[root@xingdian ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2022-09-25_19-40-47/ + +第一次增量回滚: +[root@xingdian ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2022-09-25_19-40-47/ --incremental-dir=/xtrabackup/zeng/2022-09-25_19-56-00/ + +第二次增量回滚: +[root@xingdian ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2022-09-25_19-40-47/ --incremental-dir=/xtrabackup/zeng/2022-09-25_19-58-12/ + +根据实际增量备份的次数回滚,可以想恢复到那个时间节点就回滚到那个时间节点,所有的回滚都给全备 +``` + +​ 恢复数据: + +```shell +[root@xingdian ~]# innobackupex --copy-back /xtrabackup/full/2022-09-25_19-40-47/ +``` + +​ 修改权限: + +```shell +[root@xingdian ~]# chown mysql.mysql /var/lib/mysql -R +``` + +​ 启动数据库: + +```shell +[root@xingdian ~]# systemctl start mysqld +``` + +​ 验证: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| sys | +| t1 | +| t2 | +| t3 | ++--------------------+ +``` + +##### 差异备份 + +原理:只备份跟完整备份不一样的 + +注意:在进行增量备份前先进行完整备份 + +案例:周一进行全备,周二到周天进行差异备份 + +​ 完整备份:(周一) + +```shell +[root@xingdian ~]# mkdir -p /xtrabackup/full +[root@xingdian ~]# innobackupex --user=root --password=QianFeng@123 /xtrabackup/full +``` + +​ 模拟数据增加(略) + +​ 第一次差异备份:(周二) + +```shell +[root@xingdian ~]# mkdir -p /xtrabackup/jian +[root@xingdian ~]# innobackupex --user=root --password=QianFeng@123 --incremental /xtrabackup/jian --incremental-basedir=/xtrabackup/full/2022-09-25_20-10-52/ + +查看第一次差异备份的数据: +[root@xingdian ~]# ls /xtrabackup/jian/ +2022-09-25_20-12-55 +``` + +​ 模拟数据增加(略) + +​ 第二次差异备份:(周三) + +```shell +[root@xingdian ~]# innobackupex --user=root --password=QianFeng@123 --incremental /xtrabackup/jian --incremental-basedir=/xtrabackup/full/2022-09-25_20-10-52/ + +查看第二次差异备份的数据: +[root@xingdian ~]# ls /xtrabackup/jian/ +2022-09-25_20-12-55 2022-09-25_20-14-32 + +注意:后面的差异备份跟之前一样,根据需求可以继续差异备份 +``` + +差异备份恢复流程:(模拟数据丢失) + +​ 停止数据库: + +```shell +[root@xingdian ~]# systemctl stop mysqld +``` + +​ 删除数据: + +```shell +[root@xingdian ~]# rm -rf /var/lib/mysql/* +[root@xingdian ~]# rm -rf /var/log/mysqld.log +``` + +​ 重演数据回滚: + +```shell +完整备份回滚: +[root@xingdian ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2022-09-25_20-10-52/ + +差异备份回滚(根据差异备份的原理,如果恢复所有数据只需要将最后依次差异回滚) +[root@xingdian ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2022-09-25_20-10-52/ --incremental-dir=/xtrabackup/jian/2022-09-25_20-14-32/ +``` + +​ 恢复数据: + +```shell +[root@xingdian ~]# innobackupex --copy-back /xtrabackup/full/2022-09-25_20-10-52/ +``` + +​ 修改权限: + +```shell +[root@xingdian ~]# chown mysql.mysql /var/lib/mysql -R +``` + +​ 启动数据库: + +```shell +[root@xingdian ~]# systemctl start mysqld +``` + +​ 数据验证: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| k1 | +| k2 | +| mysql | +| performance_schema | +| sys | ++--------------------+ +9 rows in set (0.00 sec) +``` + +#### 4.mysqldump备份 + +备份表:(前提有库有表) + +```shell +[root@xingdian ~]# mysqldump -u root -pQianFeng@123 k1 t1 > /t1.sql +``` + +恢复表:(恢复之前模拟数据丢失) + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 k1 < /t1.sql +mysql: [Warning] Using a password on the command line interface can be insecure. +``` + +验证: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "use k1;show tables" +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------+ +| Tables_in_k1 | ++--------------+ +| t1 | ++--------------+ +``` + +备份一个库: + +```shell +[root@xingdian ~]# mysqldump -u root -pQianFeng@123 k1 > /k1.sql +``` + +备份多个库: + +```shell +[root@xingdian ~]# mysqldump -u root -pQianFeng@123 -B k1 k2 > /kall.sql +``` + +备份所有库: + +```shell +[root@xingdian ~]# mysqldump -u root -pQianFeng@123 -A > /all.sql +``` + +数据恢复: + +​ 为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志 + +​ binlog使用binlog日志恢复数据时也会产生binlog日志(如果开启的话,需要关闭) + +```shell +mysql> set sql_log_bin=0; +Query OK, 0 rows affected (0.00 sec) +``` + +​ 模拟数据丢失(略) + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 -D k1 < /k1.sql +mysql: [Warning] Using a password on the command line interface can be insecure. +ERROR 1049 (42000): Unknown database 'k1' +出现该错误是因为在恢复的时候需要有库的存在 + +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "create database k1" +[root@xingdian ~]# mysql -u root -pQianFeng@123 -D k1 < /k1.sql + +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "create database k1" +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "create database k2" +[root@xingdian ~]# mysql -u root -pQianFeng@123 -D k1 k2 < /kall.sql + +或者 +mysql> source /k1.sql +``` + +验证: + +```shell +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "use k1; show tables;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------+ +| Tables_in_k1 | ++--------------+ +| t1 | ++--------------+ +[root@xingdian ~]# mysql -u root -pQianFeng@123 -e "use k2; show tables;" +mysql: [Warning] Using a password on the command line interface can be insecure. ++--------------+ +| Tables_in_k2 | ++--------------+ +| t1 | ++--------------+ +``` + +#### 5.binlog日志备份 + +原理:日志方法备份恢复数据 + +日志默认存储位置: + +​ rpm : /var/lib/mysql + +​ 编译: 安装目录的var下 + +产生日志: + +​ 方式一:编译安装 + +```shell +[root@xingdian ~]# mysqld_safe --log-bin --user=mysql --server-id=1 & + +查看binlog日志 +[root@xingdian ~]# mysqlbinlog slave2-bin.000001 -v --base64-output=decode-rows + 时间点 : 141126 14:04:49 + 位置点 : at 106 +``` + +​ 方式二:rpm安装(永久) + +```shell +[root@xingdian ~]# vim /etc/my.cnf +log-bin=mylog +server-id=1 //做主从复制使用 + +[root@xingdian ~]# systemctl restart mysqld + +查看: +[root@xingdian ~]# ls /var/lib/mysql +auto.cnf client-key.pem ib_logfile1 mysql private_key.pem sys +ca-key.pem ib_buffer_pool ibtmp1 mysql.sock public_key.pem xingdian-bin.index +ca.pem ibdata1 mylog.000001 mysql.sock.lock server-cert.pem xtrabackup_info +client-cert.pem ib_logfile0 mylog.index + +[root@xingdian ~]# mysqlbinlog /var/lib/mysql/mylog.000001 -v --base64-output=decode-rows +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +# at 4 +#220925 21:12:47 server id 1 end_log_pos 123 CRC32 0x52358645 Start: binlog v 4, server v 5.7.39-log created 220925 21:12:47 at startup +# Warning: this binlog is either in use or was not closed properly. +ROLLBACK/*!*/; +# at 123 +#220925 21:12:47 server id 1 end_log_pos 154 CRC32 0xa84d8536 Previous-GTIDs +# [empty] +# at 154 +#220925 21:13:38 server id 1 end_log_pos 219 CRC32 0xc2b00431 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no +SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; +# at 219 +#220925 21:13:38 server id 1 end_log_pos 307 CRC32 0x635401a5 Query thread_id=2 exec_time=0 error_code=0 +SET TIMESTAMP=1664111618/*!*/; +SET @@session.pseudo_thread_id=2/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; +SET @@session.sql_mode=1436549152/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C utf8 *//*!*/; +SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +create database t1 +/*!*/; +SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/; +DELIMITER ; +# End of log file +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; + +方法二: +mysql> show binlog events in "mylog.000001"; ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| Log_name | Pos | Event_type | Server_id | End_log_pos | Info | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| mylog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.39-log, Binlog ver: 4 | +| mylog.000001 | 123 | Previous_gtids | 1 | 154 | | +| mylog.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 219 | Query | 1 | 307 | create database t1 | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +4 rows in set (0.00 sec) + +默认查看第一个 +mysql> show binlog events; ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| Log_name | Pos | Event_type | Server_id | End_log_pos | Info | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| mylog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.39-log, Binlog ver: 4 | +| mylog.000001 | 123 | Previous_gtids | 1 | 154 | | +| mylog.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 219 | Query | 1 | 307 | create database t1 | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +4 rows in set (0.00 sec) +``` + +数据恢复: + +​ 根据时间点恢复数据: + +```shell +[root@xingdian ~]# mysqlbinlog --start-datetime='2022-9-25 21:12:47' --stop-datetime='2022-9-25 21:16:55' /var/lib/mysql/mylog.000001 | mysql -u root -pQianFeng@123 +``` + +​ 根据位置点恢复数据: + +```shell +mysql> show binlog events; ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| Log_name | Pos | Event_type | Server_id | End_log_pos | Info | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +| mylog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.39-log, Binlog ver: 4 | +| mylog.000001 | 123 | Previous_gtids | 1 | 154 | | +| mylog.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 219 | Query | 1 | 307 | create database t1 | +| mylog.000001 | 307 | Anonymous_Gtid | 1 | 372 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 372 | Query | 1 | 453 | drop database t1 | +| mylog.000001 | 453 | Anonymous_Gtid | 1 | 518 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 518 | Query | 1 | 606 | create database t1 | +| mylog.000001 | 606 | Anonymous_Gtid | 1 | 671 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | +| mylog.000001 | 671 | Query | 1 | 752 | drop database t1 | ++--------------+-----+----------------+-----------+-------------+---------------------------------------+ +[root@xingdian ~]# mysqlbinlog --start-position 219 --stop-position 307 /var/lib/mysql/mylog.000001 | mysql -u root -pQianFeng@123 +``` \ No newline at end of file diff --git a/第六章:主从复制及读写分离.md b/第六章:主从复制及读写分离.md new file mode 100644 index 0000000..0090744 --- /dev/null +++ b/第六章:主从复制及读写分离.md @@ -0,0 +1,1501 @@ +

主从复制及读写分离

+ +**作者:行癫(盗版必究)** + +------ + +## 一:主从复制 + +#### 1.主从复制概念 + +什么是主从复制: + +​ 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库 + +主从复制的作用: + +​ 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失 + +​ 架构的扩展,业务量越来越大,I/O访问频率过高,单机无法满足,多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能 + +​ 读写分离,使数据库能支撑更大的并发 + +主从复制的原理: + +​ 数据库有个bin-log二进制文件,记录了所有sql语句 + +​ 我们的目标就是把主数据库的bin-log文件的sql语句复制到从库 + +​ 让其在从数据的relay-log(中继日志)重做日志文件中再执行一次这些sql语句即可 + +image-20220926231910240 + +总结: + +​ 从库slave生成两个线程,i/o线程和sql线程,i/o将变更记录写到二进制日志文件中,再写到中继日志中,sql线程读取中继日志,解析操作,最终数据统一 + +注意: + +​ I/O进程:负责通信 + +​ SQL进程:负责写数据,根据log日志写数据 + +#### 2.主从复制部署 + +##### 环境准备 + +| 节点 | IP地址 | +| :----: | :--------: | +| Master | 10.0.0.128 | +| Slave | 10.0.0.42 | + +注意: + +​ 所有节点关闭防火墙和selinux + +​ 保证yum仓库可用 + +​ 保证网络畅通 + +​ 如果是克隆的服务器需要修改每台数据库的server-uuid + +修改主机名:(所有节点)(可选操作) + +```shell +[root@xingdian ~]# hostnamectl set-hostname master +[root@xingdian ~]# hostnamectl set-hostname slave +``` + +添加本地解析:(所有节点)(可选操作) + +```shell +[root@master ~]# cat /etc/hosts +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +10.0.0.128 master +10.0.0.42 slave + +[root@slave ~]# cat /etc/hosts +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +10.0.0.128 master +10.0.0.42 slave +``` + +##### Master部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +主服务器部署: + +```shell +[root@master ~]# vi /etc/my.cnf +log-bin = my1log +server-id = 1 +``` + +创建授权账户: + +```shell +[root@master ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. +mysql> grant all on *.* to 'slave'@'%' identified by 'QianFeng@123'; +mysql> flush privileges; +mysql> exit +Bye +``` + +重启服务: + +```shell +[root@master ~]# systemctl restart mysqld +``` + +注意: + +replication slave: + +​ 拥有此权限可以查看从服务器,从主服务器读取二进制日志 + +super权限: + +​ 允许用户使用修改全局变量的SET语句以及CHANGE MASTER语句 + +reload权限: + +​ 必须拥有reload权限,才可以执行flush [tables | logs | privileges] + +##### Slave部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +从服务器部署: + +```shell +[root@slave ~]# vi /etc/my.cnf +log-bin = my2log +server-id = 2 +``` + +重启服务: + +```shell +[root@slave ~]# systemctl restart mysqld +``` + +获取主服务器信息:(主服务器操作) + +```shell +[root@master ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show binlog events; ++---------------+-----+----------------+-----------+-------------+---------------------------------------+ +| Log_name | Pos | Event_type | Server_id | End_log_pos | Info | ++---------------+-----+----------------+-----------+-------------+---------------------------------------+ +| my1log.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.39-log, Binlog ver: 4 | +| my1log.000001 | 123 | Previous_gtids | 1 | 154 | | ++---------------+-----+----------------+-----------+-------------+---------------------------------------+ +2 rows in set (0.00 sec) +``` + +指定主服务器信息:(从服务器操作) + +```shell +[root@slave ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> edit + -> ; +Query OK, 0 rows affected, 2 warnings (0.01 sec) + +注意:edit中添加的内容 +CHANGE MASTER TO + MASTER_HOST='master', + MASTER_USER='slave', + MASTER_PASSWORD='QianFeng@123', + MASTER_PORT=3306, + MASTER_LOG_FILE='my1log.000001', + MASTER_LOG_POS=4, + MASTER_CONNECT_RETRY=10; + +参数解释: +CHANGE MASTER TO + MASTER_HOST='mysql-master-1.blackmed.cn/ip', + MASTER_USER='slave', //主服务器用户 + MASTER_PASSWORD='big', + MASTER_PORT=3306, + MASTER_LOG_FILE='master2-bin.001', //日志文件 + MASTER_LOG_POS=4, //日志位置 + MASTER_CONNECT_RETRY=10; //默认尝试次数 +获取参数: +mysql> help change master to +``` + +启动slave: + +```shell +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) +``` + +注意: + +​ stop slave;停止slave + +​ reset master;删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件;用于第一次进行搭建主从库时,进行主库binlog初始化工作 + +​ reset slave;用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件 + +查看主从状态: + +```shell +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master + Master_User: slave + Master_Port: 3306 + Connect_Retry: 10 + Master_Log_File: my1log.000001 + Read_Master_Log_Pos: 154 + Relay_Log_File: slave-relay-bin.000002 + Relay_Log_Pos: 361 + Relay_Master_Log_File: my1log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 154 + Relay_Log_Space: 568 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 85c6acc4-3db0-11ed-b302-000c29311164 + Master_Info_File: /var/lib/mysql/master.info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: + Executed_Gtid_Set: + Auto_Position: 0 + Replicate_Rewrite_DB: + Channel_Name: + Master_TLS_Version: +1 row in set (0.00 sec) +``` + +注意: + +​ Slave_IO_Running: Yes + +​ Slave_SQL_Running: Yes + +验证: + +​ 主服务器创建数据: + +```shell +mysql> create database t1; +Query OK, 1 row affected (0.00 sec) +``` + +​ 从服务器查看数据: + +```shell +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| sys | +| t1 | ++--------------------+ +5 rows in set (0.00 sec) +``` + +## 二:GTID主从复制 + +#### 1.GTID概念 + +​ GTID基于事务ID复制 + +​ GTID全局事务标识(global transaction identifiers) + +​ 是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置 + +​ 不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制 + +#### 2.GTID组成 + +​ GTID = source_id:transaction_id + +​ source_id源id,用于鉴别原服务器,即mysql服务器唯一的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID + +​ transaction_id事务id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务 + +示例: + +​ 3E11FA47-71CA-11E1-9E33-C80AA9429562:23 + +​ 前面的一串为服务器的server_uuid + +​ 后面的23为transaction_id + +#### 3.GTID工作原理 + +​ master更新数据时,会在事务前产生GTID,一同记录到binlog日志中 + +​ slave端的i/o 线程将变更的binlog,写入到本地的relay log中 + +​ sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录 + +​ 如果有记录,说明该GTID的事务已经执行,slave会忽略 + +​ 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog + +#### 4.主从部署 + +​ 注意:实验之前环境初始化,不要有残留的数据 + +##### 环境准备 + +| 节点 | IP地址 | +| :----: | :--------: | +| Master | 10.0.0.128 | +| Slave | 10.0.0.42 | + +注意: + +​ 所有节点关闭防火墙和selinux + +​ 保证yum仓库可用 + +​ 保证网络畅通 + +​ 如果是克隆的服务器需要修改每台数据库的server-uuid + +修改主机名:(所有节点)(可选操作) + +```shell +[root@xingdian ~]# hostnamectl set-hostname master +[root@xingdian ~]# hostnamectl set-hostname slave +``` + +添加本地解析:(所有节点)(可选操作) + +```shell +[root@master ~]# cat /etc/hosts +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +10.0.0.128 master +10.0.0.42 slave + +[root@slave ~]# cat /etc/hosts +127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 +::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 +10.0.0.128 master +10.0.0.42 slave +``` + +##### Master部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +主服务器部署: + +```shell +[root@master ~]# vim /etc/my.cnf +log-bin +server-id=1 +gtid_mode = ON +enforce_gtid_consistency=1 +``` + +创建授权用户: + +```shell +[root@master ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> grant all on *.* to slave@'%' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> flush privileges; +Query OK, 0 rows affected (0.00 sec) + +mysql> exit +Bye +``` + +重启服务: + +```shell +[root@master ~]# systemctl restart mysqld +``` + +##### Slave部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +从服务器部署: + +```shell +[root@slave ~]# vim /etc/my.cnf +log-bin +server-id=2 +gtid_mode = ON +enforce_gtid_consistency=1 +relay_log_recovery = on +master-info-repository=TABLE +relay-log-info-repository=TABLE +//这两个参数会将master.info和relay.info保存在表中,默认是Myisam引擎,官方建议用 +``` + +重启服务: + +```shell +[root@slave ~]# systemctl restart mysqld +``` + +配置连接主服务器: + +```shell +[root@slave ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> change master to + -> master_host='master', + -> master_user='slave', + -> master_password='QianFeng@123', + -> master_auto_position=1; +Query OK, 0 rows affected, 2 warnings (0.00 sec) +``` + +启动Slave: + +```shell +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) +``` + +主从状态验证: + +```shell +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: master-bin.000001 + Read_Master_Log_Pos: 154 + Relay_Log_File: slave-relay-bin.000002 + Relay_Log_Pos: 369 + Relay_Master_Log_File: master-bin.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 154 + Relay_Log_Space: 576 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 00813e87-4321-11ed-a33c-000c29311164 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: + Executed_Gtid_Set: + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: + Master_TLS_Version: +1 row in set (0.00 sec) +``` + +数据验证: + +主服务器创建数据: + +```shell +[root@master ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> create database qfcloud; +Query OK, 1 row affected (0.00 sec) + +mysql> exit +Bye +``` + +从服务器查验数据: + +```shell +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| qfcloud | +| sys | ++--------------------+ +5 rows in set (0.00 sec) +``` + +## 三:GTID双主双从 + +#### 1.环境准备 + +注意: + +​ 实验之前环境初始化,不要有残留的数据 + +​ 先做双主,M-M互为主从,从是双主的从 + +| 节点 | IP地址 | +| :------: | :--------: | +| Master-1 | 10.0.0.128 | +| Master-2 | 10.0.0.46 | +| Slave-1 | 10.0.0.42 | +| Slave-2 | 10.0.0.45 | + +注意: + +​ 所有节点关闭防火墙和selinux + +​ 保证yum仓库可用 + +​ 保证网络畅通 + +​ 如果是克隆的服务器需要修改每台数据库的server-uuid + +#### 2.Master-1部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +主服务器一部署: + +```shell +[root@master-1 ~]# vim /etc/my.cnf +log-bin = my1log +server-id = 1 +gtid_mode=ON +enforce_gtid_consistency=1 +``` + +创建授权账户: + +```shell +[root@master-1 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> grant all on *.* to 'slave'@'%' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> flush privileges; +Query OK, 0 rows affected (0.00 sec) + +mysql> exit +Bye +``` + +重启服务: + +```shell +[root@master-1 ~]# systemctl restart mysqld +``` + +#### 3.Master-2部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +主服务器二部署: + +```shell +[root@master-2 ~]# vim /etc/my.cnf +log-bin = my2log +server-id = 2 +gtid_mode=ON +enforce_gtid_consistency=1 +``` + +创建授权账户: + +```shell +[root@master-2 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 4 +Server version: 5.7.39 MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> grant all on *.* to 'slave'@'%' identified by 'QianFeng@123'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> flush privileges; +Query OK, 0 rows affected (0.00 sec) + +mysql> exit +Bye +``` + +重启服务: + +```shell +[root@master-2 ~]# systemctl restart mysqld +``` + +#### 4.双主互为主从 + +Master-1: + +```shell +[root@master-1 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> change master to + -> master_host='master-2', + -> master_user='slave', + -> master_password='QianFeng@123', + -> master_auto_position=1; +Query OK, 0 rows affected, 2 warnings (0.01 sec) + +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) + +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-2 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my2log.000001 + Read_Master_Log_Pos: 154 + Relay_Log_File: master-1-relay-bin.000002 + Relay_Log_Pos: 361 + Relay_Master_Log_File: my2log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 154 + Relay_Log_Space: 571 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 2 + Master_UUID: 1b453d94-452e-11ed-b744-000c2936b606 + Master_Info_File: /var/lib/mysql/master.info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: + Master_TLS_Version: +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +Master-2: + +```shell +[root@master-2 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 3 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> change master to + -> master_host='master-1', + -> master_user='slave', + -> master_password='QianFeng@123', + -> master_auto_position=1; +Query OK, 0 rows affected, 2 warnings (0.01 sec) + +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) + +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-1 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my1log.000001 + Read_Master_Log_Pos: 587 + Relay_Log_File: master-2-relay-bin.000002 + Relay_Log_Pos: 794 + Relay_Master_Log_File: my1log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 587 + Relay_Log_Space: 1004 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 146f4cae-452e-11ed-b87f-000c29311164 + Master_Info_File: /var/lib/mysql/master.info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: + Master_TLS_Version: +1 row in set (0.00 sec) + +mysql> exit +Bye +``` + +#### 5.Slave-1部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +从服务器一部署: + +```shell +[root@slave-1 ~]# vim /etc/my.cnf +log-bin = my3log +server-id = 3 +gtid_mode=ON +enforce_gtid_consistency=1 +relay_log_info_repository = TABLE +master_info_repository = TABLE +relay_log_recovery = on + 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性 +``` + +重启服务: + +```shell +[root@slave-1 ~]# systemctl restart mysqld +``` + +从连接主服务器: + +```shell +[root@slave-1 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CHANGE MASTER TO + -> MASTER_HOST='master-1', + -> MASTER_USER='slave', + -> MASTER_PASSWORD='QianFeng@123', + -> MASTER_AUTO_POSITION=1 FOR CHANNEL 'master-1'; +Query OK, 0 rows affected, 2 warnings (0.00 sec) + +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) + +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-1 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my1log.000001 + Read_Master_Log_Pos: 587 + Relay_Log_File: slave-1-relay-bin-master@002d1.000002 + Relay_Log_Pos: 794 + Relay_Master_Log_File: my1log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 587 + Relay_Log_Space: 1016 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 146f4cae-452e-11ed-b87f-000c29311164 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: master-1 + Master_TLS_Version: +1 row in set (0.00 sec) + + +mysql> CHANGE MASTER TO + -> MASTER_HOST='master-2', + -> MASTER_USER='slave', + -> MASTER_PASSWORD='QianFeng@123', + -> MASTER_AUTO_POSITION=1 FOR CHANNEL 'master-2'; +Query OK, 0 rows affected, 2 warnings (0.01 sec) + +mysql> start slave; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-1 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my1log.000001 + Read_Master_Log_Pos: 587 + Relay_Log_File: slave-1-relay-bin-master@002d1.000002 + Relay_Log_Pos: 794 + Relay_Master_Log_File: my1log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 587 + Relay_Log_Space: 1016 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 146f4cae-452e-11ed-b87f-000c29311164 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: master-1 + Master_TLS_Version: +*************************** 2. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-2 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my2log.000001 + Read_Master_Log_Pos: 154 + Relay_Log_File: slave-1-relay-bin-master@002d2.000002 + Relay_Log_Pos: 361 + Relay_Master_Log_File: my2log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 154 + Relay_Log_Space: 583 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 2 + Master_UUID: 1b453d94-452e-11ed-b744-000c2936b606 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: master-2 + Master_TLS_Version: +2 rows in set (0.00 sec) +``` + +#### 6.Slave-2部署 + +安装数据库:(略) + +启动数据库:(略) + +修改数据库初始密码:(略) + +从服务器二部署: + +```shell +[root@slave-2 ~]# vim /etc/my.cnf +log-bin = my4log +server-id = 4 +gtid_mode=ON +enforce_gtid_consistency=1 +relay_log_info_repository = TABLE +master_info_repository = TABLE +relay_log_recovery = on +``` + +重启服务: + +```shell +[root@slave-2 ~]# systemctl restart mysqld +``` + +从连接主服务器: + +```shell +[root@slave-2 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> CHANGE MASTER TO + -> MASTER_HOST='master-1', + -> MASTER_USER='slave', + -> MASTER_PASSWORD='QianFeng@123', + -> MASTER_AUTO_POSITION=1 FOR CHANNEL 'master-1'; +Query OK, 0 rows affected, 2 warnings (0.01 sec) + +mysql> start slave; +Query OK, 0 rows affected (0.00 sec) + +mysql> CHANGE MASTER TO + -> MASTER_HOST='master-2', + -> MASTER_USER='slave', + -> MASTER_PASSWORD='QianFeng@123', + -> MASTER_AUTO_POSITION=1 FOR CHANNEL 'master-2'; +Query OK, 0 rows affected, 2 warnings (0.00 sec) + +mysql> start slave; +Query OK, 0 rows affected, 1 warning (0.01 sec) + +mysql> show slave status\G +*************************** 1. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-1 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my1log.000001 + Read_Master_Log_Pos: 587 + Relay_Log_File: slave-2-relay-bin-master@002d1.000002 + Relay_Log_Pos: 794 + Relay_Master_Log_File: my1log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 587 + Relay_Log_Space: 1016 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 1 + Master_UUID: 146f4cae-452e-11ed-b87f-000c29311164 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: master-1 + Master_TLS_Version: +*************************** 2. row *************************** + Slave_IO_State: Waiting for master to send event + Master_Host: master-2 + Master_User: slave + Master_Port: 3306 + Connect_Retry: 60 + Master_Log_File: my2log.000001 + Read_Master_Log_Pos: 154 + Relay_Log_File: slave-2-relay-bin-master@002d2.000002 + Relay_Log_Pos: 361 + Relay_Master_Log_File: my2log.000001 + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + Replicate_Do_DB: + Replicate_Ignore_DB: + Replicate_Do_Table: + Replicate_Ignore_Table: + Replicate_Wild_Do_Table: + Replicate_Wild_Ignore_Table: + Last_Errno: 0 + Last_Error: + Skip_Counter: 0 + Exec_Master_Log_Pos: 154 + Relay_Log_Space: 583 + Until_Condition: None + Until_Log_File: + Until_Log_Pos: 0 + Master_SSL_Allowed: No + Master_SSL_CA_File: + Master_SSL_CA_Path: + Master_SSL_Cert: + Master_SSL_Cipher: + Master_SSL_Key: + Seconds_Behind_Master: 0 +Master_SSL_Verify_Server_Cert: No + Last_IO_Errno: 0 + Last_IO_Error: + Last_SQL_Errno: 0 + Last_SQL_Error: + Replicate_Ignore_Server_Ids: + Master_Server_Id: 2 + Master_UUID: 1b453d94-452e-11ed-b744-000c2936b606 + Master_Info_File: mysql.slave_master_info + SQL_Delay: 0 + SQL_Remaining_Delay: NULL + Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates + Master_Retry_Count: 86400 + Master_Bind: + Last_IO_Error_Timestamp: + Last_SQL_Error_Timestamp: + Master_SSL_Crl: + Master_SSL_Crlpath: + Retrieved_Gtid_Set: + Executed_Gtid_Set: 146f4cae-452e-11ed-b87f-000c29311164:1-2 + Auto_Position: 1 + Replicate_Rewrite_DB: + Channel_Name: master-2 + Master_TLS_Version: +2 rows in set (0.00 sec) +``` + +#### 7.验证 + +主服务器创建数据: + +```shell +[root@master-1 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 9 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> create database qfcloud; +Query OK, 1 row affected (0.00 sec) + +mysql> exit +Bye +``` + +其他服务器验证: + +```shell +[root@master-2 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 8 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| qfcloud | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +[root@slave-1 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 8 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| qfcloud | +| sys | ++--------------------+ +5 rows in set (0.00 sec) + +[root@slave-2 ~]# mysql -u root -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 7 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> show databases; ++--------------------+ +| Database | ++--------------------+ +| information_schema | +| mysql | +| performance_schema | +| qfcloud | +| sys | ++--------------------+ +5 rows in set (0.00 sec) +``` diff --git a/第四章:数据库日志管理.md b/第四章:数据库日志管理.md new file mode 100644 index 0000000..974d4e0 --- /dev/null +++ b/第四章:数据库日志管理.md @@ -0,0 +1,135 @@ +

数据库日志管理

+ +**作者:行癫(盗版必究)** + +------ + +## 一:日志管理 + +image-20220925214046253 + +#### 1.日志分类 + +​ 错误日志 :启动,停止,关闭失败报错。rpm安装日志位置 /var/log/mysqld.log + +​ 通用查询日志:所有的查询都记下来 + +​ 二进制日志:实现备份,增量备份。只记录改变数据,除了select都记 + +​ 中继日志:读取主服务器的binlog,在本地回放。保持一致 + +​ slow log:慢查询日志,指导调优,定义某一个查询语句,定义超时时间,通过日志提供调优建议给开发人员 + +​ DDL log: 定义语句的日志 + +#### 2.Error Log + +```shell +log-error=/var/log/mysqld.log +``` + +#### 3.Binary Log + +``` +log-bin=/var/log/mysql-bin/slave2 +server-id=2 + +[root@slave2 ~]# mkdir /var/log/mysql-bin +[root@slave2 ~]# chown mysql.mysql /var/log/mysql-bin/ +[root@slave2 ~]# systemctl restart mysqld +``` + +注意: + +​ 需要提前开启 + +查看binlog日志: + +```shel +[root@slave2 ~]# mysqlbinlog slave2-bin.000001 -v --base64-output=decode-rows + 时间点 : 141126 14:04:49 + 位置点 : at 106 +注: +1. 重启mysqld 会截断 +2. flush logs 会截断 +3. reset master 删除所有binlog rm -rf /var/lib/mysql/*.000001 +4. 删除部分 +PURGE BINARY LOGS TO 'mysql-bin.010'; +PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26'; + +截取binlog +all: +# mysqlbinlog mysql.000002 + +datetime: +# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" +# mysqlbinlog mysql.000002 --stop-datetime="2018-12-05 11:02:54" +# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" --stop-datetime="2018-12-05 11:02:54" + +position: +# mysqlbinlog mysql.000002 --start-position=260 +# mysqlbinlog mysql.000002 --stop-position=260 +# mysqlbinlog mysql.000002 --start-position=260 --stop-position=930 +``` + +#### 4.Slow Query Log + +开启慢查询日志: + +```shell +[root@xingdian ~]# vim /etc/my.cnf +slow_query_log=1 +slow_query_log_file=/var/log/mysql-slow/slow.log +long_query_time=3 设置慢查询超时时间 单位是:秒 +``` + +创建对应目录: + +```shell +[root@xingdian ~]# mkdir /var/log/mysql-slow +[root@xingdian ~]# chown mysql.mysql mysql-slow +``` + +重启服务: + +```shell +[root@xingdian ~]# systemctl restart mysqld +``` + +验证: + +```shell +[root@xingdian ~]# mysql -uroot -pQianFeng@123 +mysql: [Warning] Using a password on the command line interface can be insecure. +Welcome to the MySQL monitor. Commands end with ; or \g. +Your MySQL connection id is 2 +Server version: 5.7.39-log MySQL Community Server (GPL) + +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +Oracle is a registered trademark of Oracle Corporation and/or its +affiliates. Other names may be trademarks of their respective +owners. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +mysql> select sleep(6); ++----------+ +| sleep(6) | ++----------+ +| 0 | ++----------+ +1 row in set (6.00 sec) + +mysql> exit +Bye +[root@xingdian ~]# cat /var/log/mysql-slow/slow.log +/usr/sbin/mysqld, Version: 5.7.39-log (MySQL Community Server (GPL)). started with: +Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock +Time Id Command Argument +# Time: 2022-09-25T06:58:05.496205Z +# User@Host: root[root] @ localhost [] Id: 2 +# Query_time: 6.007094 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 +SET timestamp=1664089085; +select sleep(6); +```