https://downloads.mysql.com/archives/community/
https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
[root@db-51 /opt]#ll
total 707688
-rw-r--r-- 1 root root 724672294 Jul 18 13:48 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
2.创建mysql目录
mkdir -p /mysql_test/soft/
mkdir -p /mysql_test/mysql_3306/
mkdir -p /opt/mysql5.7.28/
cd /mysql_test/soft/
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
tar -xf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /opt/
mv /opt/mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql5.7.28/
[root@db-51 /opt]#ln -s /opt/mysql-5.7.28/ /opt/mysql
[root@db-51 /opt]#ls /opt/
mysql mysql5.7.28 mysql-5.7.28-linux-glibc2.12-x86_64
3. 设置环境变量
什么是多实例
多实例,就是一台linux上,同时运行多个mysql,当然是区别了不同的端口,例如3306、3307、3308。运行三个mysql数据库
这三个mysql,就相当于三个独立的卧室,互相没关系,在linux上的呈现区别就是
多实例的好处
可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务,且可以实现资源的逻辑隔离。
节约服务器资源。若公司资金紧张,但是数据库又需要各自尽量独立地提供服务,而且还需要用到主从复制等技术,那么选择多实例就再好不过了。
多实例的弊端
MySQL多实例有它的好处,也有其弊端,比如,会存在资源互相抢占的问题。当某个数据库实例并发很高或者有SQL慢查询时,整个实例会消耗大量的系统CPU、磁盘I/O等资源,导致服务器上的其他数据库实例提供服务的质量一起下降。
这就相当于大家住在一个房子的不同卧室中,早晨起来上班,都要刷牙、洗脸等,这样卫生间就会长期处于占用状态,其他人则必须要等待。
不同实例获取的资源是相对独立的,无法像虚拟化一样完全隔离。(毕竟大家都是在同一个文件系统下)
以后超哥教大家学习虚拟化后,就可以实现完全隔离。
创建数据目录
初始化2个实例的数据
至此有3个实例了
[root@localhost.localdomain /mysql_test]#ls
mysql_3306 mysql_3307 mysql_3308 soft创建俩实例的配置文件
检查配置文件
[root@localhost.localdomain /mysql_test]#ls /etc/my*
/etc/my.cnf /etc/mysql_3307.cnf /etc/mysql_3308.cnf多实例脚本
设置多实例的密码
mysqladmin -S /123456/mysql_3307/mysql.sock password 123456
登录多实例
mysqld_safe作用
1.
mysqld作用
mysqld是mysql的核心程序,用于管理mysql的数据库文件,以及用户执行的SQL请求
mysqld读取my.cnf中 [mysqld]配置本地连接
授权语句,创建一个用户,只允许本地连接
mysql -uroot -p123456 -e "grant all privileges on *.* to ningbo@'localhost' identified by 'ningbo666';"查看mysql的用户表
本地账号登录
[root@localhost.localdomain ~]#mysql -uningbo -pningbo666
[root@localhost.localdomain ~]#mysql -uningbo -pningbo666 -h127.0.0.1
[root@localhost.localdomain ~]#mysql -uningbo -pningbo666 -hlocalhost
[root@localhost.localdomain ~]#mysql -uningbo -pningbo666 -h127.0.0.1 -P3306使用mysql套接字登录
授权,允许访问的网段
程登录白名单语法
查看mysql用户列表
创建用户
修改用户密码,root去修改
改自己密码
删除用户
查看授权规则语法
grant授权命令
授权实践
root默认不允许远程登录,给与权限,允许远程登录
grant all给一个普通开发者的账户权限,只能增删改查基本操作,且限定某个数据库,且只允许在内网环境连接。
grant select,update,delete,insert on crm.* to dev01@'10.0.0.%' identified by 'dev666';查看具体用户的权限
回收权限
只有账户、无任意权限
该账户只能登录
Mysqladmin改密码
[root@db-51 ~]#mysqladmin -uroot -p123456 password ningbo666set语句修改
update语句修改
用户修改自己密码
有关SQL的分类
DQL数据查询语言
DQL,全称为Data Query Language,其语句也称为“数据检索语句”,作用是从表中获取数据,确定数据应怎样在应用程序中给出。
关键字SELECT是DQL(也是所有SQL)用得最多的,其他DQL常用的保留字有WHERE、ORDER BY、GROUP BY和HAVING。这些单词就是我们这一节要学习的SQL语句,进行查询。
这些DQL保留字常与其他类型的SQL语句一起使用。具体语句示例如下
DML数据操作语言
DML,全称为Data Manipulation Language,中文为数据操作语言。
其语句的关键字为INSERT、UPDATE和DELETE。它们分别用于添加、修改和删除表中的行(数据)。具体语句示例如下:
TPL事务
全称为Transaction Processing Language,TPL语句用于确保被DML语句影响的表的所有行能够及时得到更新。TPL语句包括BEGIN TRANSACTION、COMMIT和ROLLBACK。
DCL授权控制
全称为Data Control Language,这类语句通过GRANT或REVOKE授权用户许可,确定单个用户和用户组对数据库对象的访问。
某些RDBMS可用GRANT或REVOKE控制对表中单个列的访问。
DDL数据定义
全称为Data Definition Language,其语句包括动词CREATE、DROP和ALTER。可使用该语言在数据库中创建新库表或删除库表,或者为表添加字段、索引等。
查看DDL语句具体信息
DCL数据授权控制
一般是运维操作的多些
DML数据操作语言
开发要重点掌握的SQL,运维熟悉就好,也就是DML数据操作语言,因为网站有各式各样的数据写入、数据读取操作,这是开发对于表的设计,是开发必须重点掌握的技能。
运维无须像开发一样,了解各种业务表的结构、设计,只需要熟悉查询数据操作。
也就是DML语句
库
数据库名
数据库属性、字符集、校对规则(大小写等)例子
表
例
字符集
我们如果想正确的读写mysql的中文数据,需要保证服务端、客户端的字符集一致
服务端是我们的mysql,客户端的形式有很多了,可能是xshell,navicat,程序等等
服务端mysql的编码设置与查看
阿里技术专家的博客
https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html
常用字符集,字符序组合
utf-8 最大支持3字节的字符,也就是中文汉字,不支持emoji符号
utf8mb4 最大支持4字节的字符,支持emoji字符
mysql8.0之前,默认字符集是latin1
8.0之后默认utf8mb4 ,目前主流网站肯定都是支持表情符号的,如emoji 😄这类。数字类型
MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。
作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
| 类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
| SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
| MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
| INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
| BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
| FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
| DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
| 类型 | 大小 | 用途 |
|---|---|---|
| CHAR | 0-255 bytes | 定长字符串 |
| VARCHAR | 0-65535 bytes | 变长字符串 |
| TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
| TEXT | 0-65 535 bytes | 长文本数据 |
| MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
| LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
| 类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
主键 primary key 简称pk
特点
1. 一张表,只能有一个pk,可以由多个列构成
2. 等于 唯一约束(Unique Key)和非空约束(NOT NULL) 的组合
3. 建议每张表都要设置主键,便于索引的应用,一般都以id列为主键,是默认自增的数字列。非空 not null
该字段必须写入数据
建议每一列都设置,便于索引应用唯一性 unique key
该列的值不得重复,你比如存储身份证号的列,每一个人的号码都是唯一,不得重复,得必须有数据的无符号 unsingned
针对数字数据类型而言,是否有符号,如负数DDL的特点是对数据库内部的对象进行创建、修改、删除等操作,不涉及对表中内容的操作和更改。
这部分是运维人员或DBA需要熟练掌握的内容,开发人员了解即可。
全称为Data Definition Language,其语句包括动词CREATE、DROP和ALTER。可使用该语言在数据库中创建新库表或删除库表,或者为表添加字段、索引等。
创建数据库
不得已数字开头,大小写不敏感
1. 库名不得以数字开头
2. 库名和业务有关,见名知意
3. 库名不得有大写字母
都是为了多系统平台的兼容性
4.创建数据库需要有指定的字符集,建议设定默认规则就是utf8mb4
5.生产环境下,禁用普通用户的drop database权限创建数据库
查看数据库
字符集和校验规则
修改数据库字符集
设置mysqld默认字符集
该配置文件
再次创建数据库试试
4.4.数据表部分
创建表
修改表
1. 添加数据表的字段(列),建议用追加方式
2. 修改列的属性,建议用modify语句
3. 修改表的属性,建议在业务不繁忙的时候修改生产级SQL审核工具
dba专用
https://yearning.io/
https://hanchuanchuan.github.io/goInception/创建库
创建表
表字段,数据类型
复制数据表
修改表结构
给students表添加一个兴趣字段,hobby 要求只能输入20个汉字以内(20)
tip:补充float类型
mysql的float语法
height float(总共有多少位,小数点后有几位)在第一列添加字段
添加身高字段,要求不超过3位数,有一位小数
在指定字段后添加
删除字段
修改表结构,数据库引擎
修改表结构,表字符集
基于目前创建的students表,默认定义好了很多的字段,字段的属性也可以修改。
change关键字
只修改字段名
只修改默认值
同时修改字段名,字段数据类型,默认值
modify关键字
删除数据表
开发要重点掌握的SQL,运维熟悉就好,也就是DML数据操作语言,因为网站有各式各样的数据写入、数据读取操作,这是开发对于表的设计,是开发必须重点掌握的技能。
运维无须像开发一样,了解各种业务表的结构、设计,只需要熟悉查询数据操作。
也就是DML语句
insert插入数据
前面的DDL语句,我们只是在定义,修改数据库,数据表的结构,属性,还没数据。
DML篇来插入数据
完整字段插入数据
插入学生数据,要指定字段,然后插入数值
插入部分字段
修改datetime字段的默认值
数据库常见做法是,如用户信息录入,以当前系统时间插入即可。
当前表结构
再次插入数据
简写,插入数据
shell插入数据练习
update更新数据
严重的问题
删除表数据
where指定条件删除数据
伪删除
为了有效防止delete误删除数据,可以人为限定SQL的删除逻辑
添加表字段,删除状态字段,0 表示被删除,1表示数据存在
可以用tinyint类型,省磁盘,从 0 到 255 的整型数据。存储大小为 1 字节增加状态列
想删除数据用update,代替delete,取消delete的执行权限即可
查询所有有效用户的数据
mysql> select *来,说说如下命令的区别
drop table new_students;
truncate table new_students;
delete from new_students;
区别?回答
1.导入数据
[root@db-51 ~]#mysql -uroot -p123456 < all_db_backup.sql
mysql: [Warning] Using a password on the command line interface can be insecure.查看表创建语句
mysql> show create table country;
mysql> show create table city;select语句
查询数据库服务端配置
查询mysql加载的变量
查看mysql内置函数 函数就是可以复用的一个功能代码
常见函数执行
Where 子查询
mysql强大之处在于基于数据表,进行复杂的查询,适用于各种复杂业务场景下,对数据的查询提取。
子查询几个关键语句执行顺序如下
DQL系列数据查询语句,作为后端开发重点,运维学习了解即可
运维以架构部署,提供数据库环境,保障数据库稳定性为主。
子查询语句顺序

查询city表中所有数据
或者
select ID,Name,CountryCode,District,Population from world.city;查询城市信息
查询所有城市名,以及人口数
# 查询所有城市、人口数量
select name,Population from city;查询city表里,所有中国的城市信息
select * from city where countrycode ='CHN';查询人口数小于500人城市信息
select * from city where Population < 500;查询中国,人口数超过500w的所有城市信息
select * from city where CountryCode='chn' and Population>查询中国或者美国的城市信息
查询人口在200万到500万之间的城市所有信息
解法1
查询中国或者美国,人口数大于500万的城市
查询城市名以qing开头的城市
select * from city where name like 'qing%'查询淮安市的人口数量
select * from city where name like 'huai%'Group by 聚合函数
常用聚合函数
group by 分组功能原理
1. 按分组条件进行排序
2. 进行分组列的去重
3. 聚合函数将其他列的结果聚合group by聚合函数练习题
统计city表有多少行数据
select count(*) from city;统计中国城市的个数
select count(*) from city where CountryCode='CHN';统计中国总人口数
select sum(Population) from city where CountryCode='CHN'统计每个国家的城市个数
SELECT统计每个国家的总人口数
select CountryCode,sum(Population) as people_num from city group by CountryCode
select CountryCode,sum(Population) as people_num from city group by CountryCode
统计中国每个省的城市个数,和城市名
having 聚合判断
当group by 排序分组后,如果还要做条件判断。
Having 练习题
统计每个国家的总人口数,只显示人口超过1亿的国家信息
# 统计每个国家的总人口数,只显示人口超过1亿的国家信息
select CountryCode,sum(Population) as 人口总数 from city group by CountryCode having sum(Population) > 100000000Order by 聚合排序
查询所有城市信息,按人口数排序输出,正序输出
select * from city order by Population
逆序输出
select * from city order by Population desc查询中国所有城市信息,且按照人口数从大到小排序输出
select * from city where CountryCode='chn' order by 'Population' desc每个国家的总人口数,总人口超过5000w的信息,并按总人口数从大到小排序输出
# 每个国家的总人口数,总人口超过5000w的信息,并按总人口数从大到小排序输出
select CountryCode,sum(Population) as 人口总数 from city GROUP BY CountryCode having sum(Population) > 50000000 order by sum(Populationlimit 分页查询
查询中国所有城市信息,以人口数从大到小排序,只显示前十名。
select查询中国所有的城市信息,并按照人口数从大到小排序输出,只显示6-10名
mysql元数据查询
show语句
练习题
连表查询
连表查询练习题1
连表练习题2
mysqldump备份语法
Mysqldump -u用户名 -p密码 参数 数据库名 > 数据备份文件
mysql自带的备份工具,可以实现本地备份,远程备份
mysqldump命令备份过程,实际上是把数据库、表,以SQL语句的形式,输出为文件的备份过程,这种方式称之为逻辑备份。
连接参数
mysqldump备份参数
全量备份
--all--database,-A 转储所有数据库中的所有表。
[root@db-51 ~]#mysqldump -uroot -p123456 -A > /mysql_backup/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.指定数据库
备份单个数据表
这里不能加上-B参数了,这是指定数据库的作用
单独指定备份某个table
备份多个表
通过sql可以看出,整个过程是
grep -Ev '#|\*|--|^$' /mysql_backup/world_city_country.sql只要表结构,不要数据
只要表数据,不要结构
备份且压缩数据
对于数据库有大量数据表,以及信息,导出的备份文件,最好是压缩后的,节省磁盘
mysqldump -uroot -p123456 employees departments | gzip > /mysql_backup/departments.sql.gz结合Binlog的备份参数
binlog是mysql一大重点,Binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息
例如更改数据库库表和更改表内容的SQL语句都会记录到binlog里,但是对库表等内容的查询则不会记录到日志中。
记录
DML,insert update,delete
DDL,create drop,alter,truncate
DCL,grant revokebinlog的作用:当有数据写入到数据库时,还会同时把更新的SQL语句写入到对应的binlog文件里,这个文件就是上文所说的binlog文件。
配置binlog
查看mysql关于bin_log的变量参数
查看binlog的配置信息
开启binlog
重启,再次查看配置
查看日志路径
[root@db-51 /mysql_backup]#ls /mysql_test/mysql_3306/logs/
mysql-bin.000001 mysql-bin.index
[root@db-51 /mysql_backup]#cat /mysql_test/mysql_3306/logs/mysql-bin.index
binlog内容的格式
事件event记录方式
二进制日志事件内容格式
这里看到| binlog_format 是ROW
查看binlog日志文件情况
查看所有日志文件的信息,二进制日志
刷新新日志文件
了解该命令即可,不能随便执行。
查看当前mysql用哪个日志文件
模拟binlog记录
查看日志事件
解密查看binlog日志
[root@db-51 /mysql_backup]#mysqlbinlog /mysql_test/mysql_3306/logs/mysql-bin.000003解密日志查看
[root@db-51 /mysql_backup]#mysqlbinlog --base64-output=decode-rows -vv /mysql_test/mysql_3306/logs/mysql-bin.0000031.前提要打开binlog功能
创建、导入数据库等操作,要提前就打开binlog,否则无法记录
2.模拟误删库,恢复数据
模拟误删除库,恢复到删库之前
3.模拟数据误删除
恢复思路
问题:数据记录在多个binlog里如何恢复
场景模拟
日志1mysql-bin.000004
日志2mysql-bin.000005
日志3,mysql-bin.000006
日志4误删除数据库lol
恢复实战
方案1:分段截取
--start-position
--stop-position方案2:时间戳截取
1. 找创建lol库的时间戳恢复步骤
查看binlog日志记录
什么是GTID
从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。
通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。
这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
在原来基于二进制日志的复制中,从库需要告知主库要从哪个偏移量pos值进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。
借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,
这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。
另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
什么是事务
为什么数据库需要事务?
讲道理应该是这样
这三步骤、必然不得出问题,上面的案例,就是这三步发生了问题!
如果有事务、就不会发生这样的事
事务就是
这三件事、三个动作,是一根绳上的蚂蚱,要么都成功,要么都失败
转账要么到表弟账户、要么就转不出去、回到自己卡里
事务的ACID特性
TRANSACTION 事务Atomicity原子性
原子性强调转账的三个步骤要么成功、要么失败
在一个事务中的所有SQL语句,要么全部执行成功,要么全部失败,即使成功的SQL语句也会被撤销,回到执行之前的状态。
Consistency一致性
一致性是指数据库从一个状态、变为另一个状态
事务开始前、与结束后,数据库的完整性约束没有被破坏。
例如转账,无论成功、或者失败、这500不会多、也不会少
要么超哥卡里扣了500元、表弟多了500元
要么超哥转账失败500元未动、表弟一毛钱也没拿到
这个总和永远是500元,不多也不少
Isolation隔离性
隔离性指的是每个读写事务对其他的事务操作,都是相互隔离不受影响的。
例如同是工商银行
Durability持久性
事务一旦提交后,结果就是永久性生效。
超哥转账500给了表弟,表弟也收到钱了,这件事就结束了,真实生效了。
正确事务执行
错误SQL事务执行
mysql默认的事务规则
在MySQL数据库中,事务默认是会自动提交的,也就是说,如果没有用 begin ... commit 来显式提交事务的话,MySQL 会认为每一条SQL语句都是一个事务,也就是每一条SQL语句都会自动提交。
可以基于mysqlbinlog去分析日志,发现每一个语句都是事务操作。
GTID长啥样
GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。
GTID 实际上 是由 UUID+TID 组成的。
其中 UUID 是一个 MySQL 实例的唯一标识。
TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
下面是一个GTID的具体形式:
形式语法
GTID = source_id :transaction_id
具体结果
2E11FA47-61CA-11E1-9E33-C70AA9429562:28在上面的定义中,每一个GTID均代表一个数据库的事务,等号右边的source_id表示执行事务的源服务器主库的uuid(也就是server_uuid)
而transaction_id是一个从1开始的自增的序列号,表示在这个主库上执行的第n个事务。
只要保证每台数据库的server_uuid全局唯一,以及每台数据库生成的transaction_id自身唯一,就能保证GTID的全局唯一性。
server_uuid是什么
还记得以前我们在my.cnf中配置了一个参数
server_id=5并且超哥要求master、slave的server_id必须唯一
为什么换成server_uuid
MySQL 5.6用128位的server_uuid代替了原本32位的server_id的大部分功能。
原因很简单,server_id依赖于my.cnf的手工配置,有可能会产生冲突,而自动产生128位uuid的算法可以保证所有的MySQL uuid都不会发生冲突。
在进行首次启动时,MySQL会自动生成一个server_uuid,并且保存到数据库目录下的auto.cnf文件里,这个文件目前存在的唯一目的就是保存server_uuid。
在MySQL再次启动时其会读取auto.cnf文件,继续使用上次生成的server_uuid。
开启uuid
开启GTID功能

mysql5.7以后的版本,默认都开启GTID功能,用处很广。基于GTID截取日志
有了gtid之后,再也不用关心日志的开始pos,结束pos了,一个gtid记录,记录一个事务。
基于gtid记录的数据恢复
重置gtid,清理binlog日志
binglog刷新
日志自动删除
日志的作用,不说大家应该都知道,可以收集、检测我们程序的健康状况
默认这些日志,大部分是未开启的,运维小于可以通过命令、配置文件,开启这些日志,以及定义存储路径。
mysql日志文件的作用:
1、能记录物理数据页面的修改的信息;
2、能将数据从逻辑上恢复至事务之前的状态;
3、能以二进制文件的形式记录了数据库中的操作;
4、能记录错误的相关信息;
5、能从主服务器中二进制文件取的事件等等。

普通日志
记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。
也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。
可以开启该功能,命令临时修改
二进制日志binlog
binlog是记录数据库被修改的SQL语句,对数据造成影响了。
一般是DDL和DML语句,包含
作用
记录mysql数据的增量数据,且用来做增量数据恢复,前面超哥已经完整的讲过、全量备份、增量备份的区别,如果不开启binlog,将无法恢复完整的数据。
以及用在主从数据复制
二进制binlog索引文件
该文件用于记录binlog的索引号
[root@db-51 ~]#cat /mysql_test/mysql_3306/logs/mysql-bin.index
/mysql_test/mysql_3306/logs/mysql-bin.000001慢查询日志
慢查询日志(slow query log)用于记录执行时间拆过指定值(long_query_time)或者没有使用索引、结果集大于1000行的SQL语句。
慢日志参数
慢查询参数调整,是数据库SQL优化重要手段
全量备份
全量数据,指的是某一整个数据库(如kings)中所有的表、以及表数据,进行备份。
例如备份所有数据库、以及所有数据,上面也讲了mysqldump的全量备份操作。
binlog
binlog是mysql一大重点,Binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库库表和更改表内容的SQL语句都会记录到binlog里,但是对库表等内容的查询则不会记录到日志中。
binlog的作用
当有数据写入到数据库时,还会同时把更新的SQL语句写入到对应的binlog文件里,这个文件就是上文所说的binlog文件。
使用mysqldump备份时,例如我们一般会写crontab,例如夜里0点整,进行数据库备份。
使用binlog的背景
问题是,每天只有到0点整才进行备份,那未备份之前,也就是两次数据库备份的间隔是24小时。
一旦在这个期间发生故障,那么数据此时就是丢失的,即使使用mysqldump的备份,也只能找回当日0点的数据。
使用binlog功能,可以解决该问题
使用binlog文件,可以将两次完整备份间隔之间的数据还原
因为binlog文件的数据就是,写入数据库,的数据
因此可以使用binlog来恢复数据,这种方式称之为二进制增量数据恢复
切割binlog图解
切割binlog作用是很有必要的
因为要确定,全量备份mysqldump和增量备份binlog的一个临界点。
当全量备份完成之后,上一次的binlog文件就没有作用了(因为此时的mysqldump全量备份,导出的数据已经包含了上一次的binlog数据)
下一次的全量备份中间的数据依然很重要,就还得存储在binlog文件里
因此需要要求,mysqldump的全量备份数据,和binlog的数据确定临界点
mysqldump的参数
-F参数切割binlog日志
--master-data参数
刚才的-F参数,是给mysqldump提供的切割binlog,但是这也需要不断的执行,不断的切割。`
mysqldump也提供了--master-data参数,能够在备份的SQL文件中,添加CHANGE MASTER语句,以及binlog文件的pos位置,也就是记录数据的写入位置。
参数解释
测试执行效果
查看备份的结果文件
-x参数
既然是数据备份,比如说淘宝网的数据库要进行全量备份,但是例如在24:00整点,还有人在写入数据,那就无法保证数据的一致性。
因此得在备份时,将表锁住,防止数据写入,得到一个完整的数据备份,也就是24:00停止所有写入操作。
实战全流程
每周一全量备份
获取GTID事务信息,获取起点
[root@db-51 ~]#grep 'SET @@GLOBAL.GTID_PURGED=' /mysql_3306_backup/full_db_2022-02-24.sql
SET @@GLOBAL.GTID_PURGED='ae068f82-06bc-11ed-839d-000c29b76f3a:1-8';查看pos值,备份开始时,binlog位置点信息
模拟次日数据变化
恢复全流程
日志截取
数据恢复
查看结果
xtrabackup工具
Percona-xtrabackup是 Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。
xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。
特点
innodb数据不影响业务mysql和maridb数据文件扩展名
| .idb文件 | 以独立表空间存储的InnoDB引擎类型的数据文件扩展名 |
|---|---|
| .ibdata文件 | 以共享表空间存储的InnoDB引擎类型的数据文件扩展名 |
| .frm文件 | 存放于表相关的元数据(meta)信息及表结构的定义信息 |
| .MYD文件 | 存放MyISAM引擎表的数据文件扩展名 |
| .MYI文件 | 存放MyISAM引擎表的索引信息文件扩展名 |
事务型引擎的ACID特性
目前为止,我们还未学习mysql的引擎,会在后面讲解,大家先了解下对于mysql的引擎是InnoDB
数据库引擎,就像是摩托车的发动机,有各种品牌的发动机
有了发动机,我们可以将摩托车跑起来,且无序关心它是怎么制造动力的
对于数据库的引擎,就是开发人员写好的一种程序,能够让运维不用关心数据是如何增删改查到磁盘上的,通过SQL语句,就可以数据。
因此数据库引擎就是一个用于存储、处理、保护数据的程序。
当前数据库是哪一款引擎
命令介绍

Xtrabackup命令是专门用于对InnoDB和XtraDB等事务引擎的数据库热备份的工具,不能用于备份MyISAM等其他类型的引擎数据,其主要特点是备份数据时完全不用锁表。
Innobackupex命令是将上述Xtrabackup命令使用perl脚本进行二次封装的工具,除了可以用于InnoDB和XtraDB等引擎之外,还可以备份MyISAM及多种引擎混合使用的场景,该命令的主要特点是备份事务引擎数据而不用锁表,可以备份非事务引擎数据,但要锁表。
DBA用的最多的是Innobackupex命令备份恢复
1.该工具用于拷贝mysql的数据目录
2. 基于InnoDB的引擎,可以实现热备,备份期间数据库读写可以正常进行,不停机备份。
2. 非InnoDB的引擎,会先进行全局锁表,禁止数据写入修改mysql客户端配置文件
全备命令
整个备份内容
查看备份的各种日志文件
恢复方案
xtraback命令恢复
mv恢复
# 或者直接mv 将数据移动回mysql的目录,和xtrabackup命令本质上一样的,都是直接复制物理文件
# 肯定不如xtraback恢复,来的可靠性强
mv /test_3306_data/* /mysql_test/mysql_3306/增量备份之前,仍然是要进行一次全量备份
后续的增量备份,就是依次增加增量的数据
xtraback自带的备份工具
- 逻辑是每次增量备份,以最近一次备份作为参照物;
- 恢复数据时,把所有的增量合并到full数据。
增量备份演练
周日full + 周一inc1 + 周二inc2 + 周三 inc3 )
备份前数据准备
模拟周日夜里11点全量备份
# 也就是进行第一次全量备份的执行
模拟周一开始数据变化了
模拟周一夜里11点增量备份
单词increment,增量的意思
第一次增量备份,需要2个参数
--incremental-basedir= # 填入上一次全量备份的目录
--incremental # 填入增量备份的目录
模拟周二白天继续数据写入,增量写入
模拟周二白天继续数据写入,增量写入
模拟周二夜里11点增量备份
开始第二次增量备份
注意,这里使用上一次增量备份的目录,而不是全量备份了
--parallel=3 开启3个线程备份,当数据量较大时候,根据CPU核数决定最大化参数
模拟周三白天数据变化
模拟周三夜里11点增量备份
模拟周四数据写入
模拟周四数据数据误删除,如何恢复
恢复思路
合并参数注意
1.先处理full数据
innobackupex --apply-log --redo-only /xtrabackup_data/full_1_2022-07-26/2.合并inc_1到full
3.inc_2合并到full
innobackupex --apply-log --redo-only --incremental-dir=inc2_2022-07-26 full_1_2022-07-26/4.inc_3合并到full
innobackupex --apply-log --redo-only --incremental-dir=inc3_2022-07-26 full_1_2022-07-26/5.对最终的full数据进行一致性校验检查
6.恢复数据且启动数据库
7.登录数据库,查看数据情况
8.恢复周四的增量写入
前提是,你在删库前的binlog还存在,如果说binlog和数据目录在一起,都被删除的话,binlog丢失了,也无法恢复数据了!!!
# 删除数据,全部mv移走即可,rm也行
[root@db-51 /xtrabackup_data]#mv /www.yuchaoit.cn/mysql_3306/* /test_3306_data/
# 因此还好我们这里有binlog备份,或者你开始就应该让binlog数据,放在其他目录管理,或者做好备份工作,一切为了数据安全。恢复t4数据
确认inc_t4表数据也回来了
立即再做一次全量备份
为什么用主从复制
MySQL主从复制集群技术使得MySQL数据库支持大规模高并发的读写操作成为可能,同时又能有效地解决物理服务器宕机场景的数据备份和进行快速业务切换的问题。
对于企业生产环境来说,MySQL主从复制主要有以下几个重要的应用场景。
slave作为master实时数据备份
主从服务器架构的设计,可以大大加强MySQL数据库架构的健壮性。例如,当主服务器出现问题时,我们可以人工切换或设置成自动切换到从服务器继续提供服务,此时从服务器的数据和宕机时的主数据库几乎是一致的。
这有些类似于NFS存储数据通过inotify+rsync将数据同步到备份的NFS服务器,只不过MySQL的复制方案是其自带的工具,实现的方式是逻辑的复制,而非文件层级的复制。
缺点
利用MySQL的主从复制技术进行数据备份,在硬件故障、软件故障、人为在数据库外误操作的场景下,该数据备份是有效的;
但对于人为地在数据库中执行drop、delete等语句删除数据的情况,从库的备份功能就没有用了,因为从服务器也会执行删除的语句。
主从复制原理(重要)面试常问
MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(我们称之为Master)复制到另一个MySQL数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。
其中有两个线程(SQL线程和IO线程)在Slave端,另外一个线程(binlog dump线程)在Master端(MySQL 5及以前是3个线程完成复制,从MySQL 6起SQL线程可以是多个)。
要实现MySQL的主从复制功能,首先必须打开Master端的binlog日志功能。
因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同的顺序执行获取的binlog日志中所记录的各种SQL操作,从而实现主从数据一致的功能。

start slave,开启主从复制经过这些,就可以确保,master和slave执行了同样的SQL。在复制状态正常的情况下,master和slave的数据是完全一样的。
复制原理小结
主从复制是异步的进行SQL语句的复制
复制时,主库有一个binlog dump 线程,从库有2个线程I/O线程、SQL线程
在MySQL5.6之后,slave的SQL线程有多个
实现1主2从部署,mysql安装不多赘述,准备配置文件即可
注意server_id的区别
以及只有主库开启了binlog日志
db-51
db-52
db-53
db-51主库操作
slave和master连接同步,得有一个账号进行连接master,允许同步数据
备份主库数据,发给slave
Slave从库操作
导入数据
[root@db-52 ~]#mysql < /opt/full.sql
[root@db-52 ~]#
[root@db-53 /opt]#
[root@db-53 /opt]#mysql < /opt/full.sql
连接master
查看slave复制状态结果
Slave_IO_Running:Yes,这个表示I/O的线程状态,I/O线程负责从主库中读取Binlog日志,并将Binlog日志写入从库的中继日志中,状态为Yes表示I/O线程工作正常,否则异常。
Slave_SQL_Running:Yes,这个表示SQL的线程状态,SQL线程负责读取中继日志(relay-log)中的数据并转换为SQL语句应用到从数据库中,状态为Yes表示I/O线程工作正常,否则异常。
Seconds_Behind_Master:0,这个表示在复制过程中,从库比主库延迟的秒数,这个参数很重要,但企业里有更准确地判断主从延迟的方法:在主库中写时间戳,然后通过从库读取时间戳,与当前数据库时间进行比较,从而认定是否真的延迟。测试主从效果
主库写入数据,查看从库结果查看主从复制原理
binlog_dump_thread
1.负责接收slave请求
2.传送主库binlog发给slave进行同步
1.IO线程 连接主库dump线程,请求master的binlog,接收master的日志,存储到从库本地的日志(relay-log)
2.SQL线程 回放relaylog,写入slave机器数据 ```
具体信息
关于slave线程重点日志

主从复制涉及的文件
[root@db-51 ~]#ls /binlog/
mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.index
从库
中继日志 relay-log
主库信息文件
relay-log.info

主库
查看复制线程状态

查看slave节点信息
从库(重点)
位置点信息
查看IO线程以获取的主库binlog的位置点
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 485SQL线程回放的relaylog的位置点
SQL线程回放relaylog的位置点,对应的主库的binlog位置点
监控如下复制状态的值
故障常见原因
解决思路
1. 网络是否通
2. 确认复制的change master配置正确
3. 主从的server_id是否正常
4. 主从的server_uuid是否正常
过滤复制
当主库上存在多个database,但从库只需要同步一部分的话就需要用到MySQL的复制过滤功能。
比如一个主库承载多个业务数据库,需要将不同业务数据库复制到不同的从库进行查询以做到业务隔离的场景。
通过过滤复制可以灵活的指定哪些库和表需要复制,哪些库不需要同步。
通常建议在从服务器上配置过滤复制,可以减轻主库的负载。
主库复制过滤相关配置(仅支持库级别过滤)(建议在从库上配置,这里仅作了解)
从库修改配置
冷配置
# 修改配置文件
replicate_do_db=yuchao_db
replicate_do_db=chaoge_linux热配置
测试主从过滤复制
# 检查slave状态
show slave status\G
# 主库数据写入mysql事务
为什么数据库需要事务?
讲道理应该是这样
这三步骤、必然不得出问题,上面的案例,就是这三步发生了问题!
如果有事务、就不会发生这样的事
事务就是
这三件事、三个动作,是一根绳上的蚂蚱,要么都成功,要么都失败
转账要么到表弟账户、要么就转不出去、回到自己卡里
事务的ACID特性
TRANSACTION 事务Atomicity原子性
原子性强调转账的三个步骤要么成功、要么失败
在一个事务中的所有SQL语句,要么全部执行成功,要么全部失败,即使成功的SQL语句也会被撤销,回到执行之前的状态。
Consistency一致性
一致性是指数据库从一个状态、变为另一个状态
事务开始前、与结束后,数据库的完整性约束没有被破坏。
例如转账,无论成功、或者失败、这500不会多、也不会少
要么超哥卡里扣了500元、表弟多了500元
要么超哥转账失败500元未动、表弟一毛钱也没拿到
这个总和永远是500元,不多也不少
Isolation隔离性
隔离性指的是每个读写事务对其他的事务操作,都是相互隔离不受影响的。
例如同是工商银行
Durability持久性
事务一旦提交后,结果就是永久性生效。
超哥转账500给了表弟,表弟也收到钱了,这件事就结束了,真实生效了。
GTID是什么
从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。
通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
在原来基于二进制日志的复制中,从库需要告知主库要从哪个偏移量进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。
借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。
另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
GTID长啥样
GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。
GTID 实际上 是由 UUID+TID 组成的。
其中 UUID 是一个 MySQL 实例的唯一标识。
TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具体形式:
形式语法
GTID =
在上面的定义中,每一个GTID均代表一个数据库的事务,等号右边的source_id表示执行事务的源服务器主库的uuid(也就是server_uuid)
而transaction_id是一个从1开始的自增的序列号,表示在这个主库上执行的第n个事务。
只要保证每台数据库的server_uuid全局唯一,以及每台数据库生成的transaction_id自身唯一,就能保证GTID的全局唯一性。
server_uuid是什么
还记得以前我们在my.cnf中配置了一个参数
server_id=5并且超哥要求master、slave的server_id必须唯一
为什么换成server_uuid
MySQL 5.6用128位的server_uuid代替了原本32位的server_id的大部分功能。
原因很简单,server_id依赖于my.cnf的手工配置,有可能会产生冲突,而自动产生128位uuid的算法可以保证所有的MySQL uuid都不会发生冲突。
在进行首次启动时,MySQL会自动生成一个server_uuid,并且保存到数据库目录下的auto.cnf文件里,这个文件目前存在的唯一目的就是保存server_uuid。
在MySQL再次启动时其会读取auto.cnf文件,继续使用上次生成的server_uuid。
[root@db-51 ~]#cat /data/mysql_3306/auto.cnf
[auto]
server-uuid=d8710e0b-0da9-11ed-bac3-000c29b76f3a使用GTID
GTID复制原理流程
relay_logrelay_log中继日志中获取数据,且执行该GTID的事务,记录到binlog中根据GTID号就可以知道事务最初是在哪个数据库上提交的
有了GTID号、可以方便主从复制的故障切换
主从故障切换
如图、在没有GTID以前,主从复制的故障切换

只需要在slave-C上执行新的change master to xxx ,指定master-B即可
问题是,同一个事务、在每台服务器上的binlog名字和位置点、可能都是不一样的
比如执行一条SQL,创建了一个新数据库,执行了一个事务,在master-A机器的binlog中数据位置如下
但是可能在机器master-B中的bin中,同一个SQL执行后,binlog数据位置可能是
那么这就是一个难题了,如果master-A宕机,需要切换到master-B
slave-C如何知道当前同步的起停数据位置点呢?
master_log_file和master_log_pos填什么?
这就是为什么mysql官方开发了GTID复制方法。
往后,同一个事务的GTID在所有节点上都是一致的,slave-C机器根据GTID就可以知道数据的停止点在哪。
并且,mysql还提供了非常方便的参数
master_auto_position,能够自动的获取GTID值,让运维更加省心了。
GTID优缺点
优点
缺点
环境准备
可以是单机多实例
也可以是多服务器
这里超哥用3台linux虚拟机服务器、初始化安装好mysql
环境清理
pkill mysqld
rm -rf /data/mysql_3306/
db-51
db-52
db-53
初始化数据
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/启动mysql
/etc/init.d/mysqld start主库、用户创建
grant replication slave on*.* to repl@'10.0.0.%' identified by 'www.yuchaoit.cn';主库gtid检查
从库操作
mysql> show slave status\G
Empty set (0.00 sec)
change master to master_host='10.0.0.51', master_user='repl', master_password='www.yuchaoit.cn' , MASTER_AUTO_POSITION=1;
start slave;测试主库事务更新
基于gtid的主从复制结果

cat >/etc/my.cnf <<'EOF'
[mysqld]
port=3306
user=mysql
basedir=/opt/mysql
datadir=/mysql_test/mysql_3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
EOF[root@db-51 ~]#cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
启动服务
systemctl enable mysqld
systemctl restart mysqld
systemctl status mysqld
如果想前台启动
[root@db-51 ~]#mysqld_safe --defaults-file=/etc/my.cnf设置密码,默认空密码
[root@db-51 ~]#mysqladmin password -S /tmp/mysql.sock 123456
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@db-51 ~]#mysql -uroot -p123456
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.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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>cat >/etc/mysql_3307.cnf <<'EOF'
[mysqld]
port=3307
user=mysql
basedir=/opt/mysql/
datadir=/mysql_test/mysql_3307/
socket=/mysql_test/mysql_3307/mysql.sock
log_error=/mysql_test/mysql_3307/mysql.log
EOF
-----------------------------------------------------------------------
cat >/etc/mysql_3308.cnf <<'EOF'
[mysqld]
port=3308
user=mysql
basedir=/opt/mysql/
datadir=/mysql_test/mysql_3308/
socket=/mysql_test/mysql_3308/mysql.sock
log_error=/mysql_test/mysql_3307/mysql.log
EOF[root@localhost.localdomain /mysql_test]#cat /mysql_test/3307.sh
port="3307"
mysql_user="mysql"
Cmdpath="/opt/mysql/bin/"
mysql_sock="/mysql_test/mysql_${port}/mysql.sock"
mysqld_pid_file_path=/mysql_test/mysql_${port}/mysqld_${port}.pid
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${Cmdpath}/mysqld_safe --defaults-file=/etc/mysql_${port}.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql{start|stop|restart}\n"
esac
[root@localhost.localdomain /mysql_test]#cat /mysql_test/3308.sh
port="3308"
mysql_user="mysql"
Cmdpath="/opt/mysql/bin/"
mysql_sock="/mysql_test/mysql_${port}/mysql.sock"
mysqld_pid_file_path=/mysql_test/mysql_${port}/mysqld_${port}.pid
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${Cmdpath}/mysqld_safe --defaults-file=/etc/mysql_${port}.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql{start|stop|restart}\n"
esac[root@localhost.localdomain /mysql_test]#bash 3307.sh start
Starting MySQL...
[root@localhost.localdomain /mysql_test]#bash 3308.sh start
Starting MySQL...
[root@localhost.localdomain /mysql_test]#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1385/sshd
tcp6 0 0 :::3306 :::* LISTEN 95138/mysqld
tcp6 0 0 :::3307 :::* LISTEN 22342/mysqld
tcp6 0 0 :::3308 :::* LISTEN 24619/mysqld
tcp6 0 0 :::22 :::* LISTEN 1385/sshdmysql -uroot -p123456 -S /mysql_test/mysql_3307/mysql.sock -e "show global variables like 'port';"
mysql -uroot -p123456 -S /mysql_test/mysql_3308/mysql.sock -e "show global variables like 'port';"cat > /etc/systemd/system/mysqld.service <<'EOF'
[Unit]
Description=mysql server by www.yuchaoit.cn
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=5000
EOF[root@db-51 ~]#cat /etc/my.cnf
[mysqld] # 服务端标签
port=3306 # 端口
server_id # 主机编号,用于主从复制
user=mysql # 内置运行用户
basedir=/opt/mysql # 软件目录
datadir=/www.yuchaoit.cn/mysql_3306 # 数据目录
socket=/tmp/mysql.sock # 套接字文件路径
[mysql]
socket=/tmp/mysql.sock # mysql客户端连接数据库,默认读取的socket文件路径
配置语法
[server] 服务端读取的配置
[mysqld] mysqld进程读取的配置
[mysqld_safe] mysqld_safe脚本会加载的配置
客户端配置参数
[mysql] 客户端命令读取的设置
[client] 所有本地客户端读取的设置
[mysqldump] 备份命令读取的设置[root@localhost.localdomain /mysql_test]#mysql -uroot -p123456 -e "select User,Host,authentication_string from mysql.user;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-----------+-------------------------------------------+
| User | Host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| ningbo | localhost | *CE257D70249031FEB9EE9D908E2C87A1CFE7155C |
+---------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)[root@localhost.localdomain ~]#mysql -uningbo -pningbo666 -S /tmp/mysql.sock -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+mysql -uroot -p123456 -S /tmp/mysql.sock -e "grant all on *.* to bob01@'10.0.0.7' identified by 'bob666';"
mysql 用户授权语法
用户名@'网段白名单'
语法
yuchao@'localhost' yuchao可以在本地登录(ip:3306),以及socket
yuchao@'10.0.0.10' yuchao只能在10.0.0.10这个客户端登录
yuchao@'10.0.0.%' yuchao只能在10.0.0.xx/24网段登录
yuchao@'10.0.0.5%' yuchao只能在10.0.0.50~59 登录
yuchao@'%' yuchao可以在任意地址登录该mysql服务端
yuchao@'db-51' 基于主机名的登录限制[root@localhost.localdomain /mysql_test]#mysql -uroot -p123456 -e "select User,Host,authentication_string from mysql.user;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-----------+-------------------------------------------+
| User | Host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| ningbo | localhost | *CE257D70249031FEB9EE9D908E2C87A1CFE7155C |
+---------------+-----------+-------------------------------------------+create user chaoge01@'localhost'; # 创建用户无密码
select user,host,authentication_string from mysql.user; # 查询
创建且设置密码
create user chaoge02@'localhost' identified by '123';alter user chaoge01@'localhost' identified by '123';
alter user chaoge01@'localhost' identified by 'yuchaoge666';[root@db-51 ~]#
[root@db-51 ~]#mysql -uchaoge02 -p123
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 27
Server version: 5.7.28 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> set password=password('chaoge666');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> drop user chaoge02@'localhost';
Query OK, 0 rows affected (0.00 sec)mysql> show privileges;
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+-------------------------+---------------------------------------+-------------------------------------------------------+
| Alter | Tables | To alter the table |
| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Create routine
查看所有文档
mysql> help grant;
语法
grant all privileges on *.* to 'yuchaoit'@'10.0.0.%' identifiedy by 'chaoge666';
授权 权限 库.表 用户@网段 密码mysql> show grants for ningbo@'localhost';
+-----------------------------------------------------+
| Grants for ningbo@localhost |
+-----------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'ningbo'@'localhost' |
+-----------------------------------------------------+
1 row in set (0.00 sec)# 移除删除权限
revoke delete on *.* from dev01@'10.0.0.%';
# 移除所有权限,针对crm这个库
revoke all on crm.* from dev01@'10.0.0.%';
再次查询
show grants for dev01@'10.0.0.%';mysql> show grants for dev01@'10.0.0.%';
+------------------------------------------+
| Grants for dev01@10.0.0.% |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'dev01'@'10.0.0.%' |
+------------------------------------------+
1 row in set (0.00 sec)All/All Privileges权限代表全局或者全数据库对象级别的所有权限
Alter权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。如果是rename表名,则要求有alter和drop原表, create和insert新表的权限
Alter routine权限代表允许修改或者删除存储过程、函数的权限
Create权限代表允许创建新的数据库和表的权限
Create routine权限代表允许创建存储过程、函数的权限
Create tablespace权限代表允许创建、修改、删除表空间和日志组的权限
Create temporary tables权限代表允许创建临时表的权限
Create user权限代表允许创建、修改、删除、重命名user的权限
Create view权限代表允许创建视图的权限
Delete权限代表允许删除行数据的权限
Drop权限代表允许删除数据库、表、视图的权限,包括truncate table命令
Event权限代表允许查询,创建,修改,删除MySQL事件
Execute权限代表允许执行存储过程和函数的权限
File权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用的命令包括load data infile,select … into outfile,load file()函数
Grant option权限代表是否允许此用户授权或者收回给其他用户你给予的权限,重新付给管理员的时候需要加上这个权限
Index权限代表是否允许创建和删除索引
Insert权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限
Lock权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写
Process权限代表允许查看MySQL中的进程信息,比如执行show processlist, mysqladmin processlist, show engine等命令
Reference权限是在5.7.6版本之后引入,代表是否允许创建外键
Reload权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表
Replication client权限代表允许执行show master status,show slave status,show binary logs命令
Replication slave权限代表允许slave主机通过此用户连接master以便建立主从复制关系
Select权限代表允许从表中查看数据,某些不查询表数据的select执行则不需要此权限,如Select 1+1, Select PI()+2;而且select权限在执行update/delete语句中含有where条件的情况下也是需要的
Show databases权限代表通过执行show databases命令查看所有的数据库名
Show view权限代表通过执行show create view命令查看视图创建的语句
Shutdown权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdown
Super权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接命令, change master to创建复制关系命令,以及create/alter/drop server等命令
Trigger权限代表允许创建,删除,执行,显示触发器的权限
Update权限代表允许修改表中的数据的权限
Usage权限是创建一个用户之后的默认权限,其本身代表连接登录权限
# by www.yuchaoit.cnmysql> set password for root@localhost=password('ningbo666');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql> update mysql.user set authentication_string=password("ningbo666") where user='root' and host='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
刷新后,权限表会更新mysql> set password=password('yuchao666');
Query OK, 0 rows affected, 1 warning (0.00 sec)1.停止服务
[root@db-51 ~]#systemctl stop mysql
2.跳过授权表,免密运行mysqld服务端
[root@db-51 ~]#mysqld_safe --skip-grant-tables --user=mysql
2022-07-20T09:45:54.661054Z mysqld_safe Logging to '/mysql_test/mysql_3306/db-51.err'.
2022-07-20T09:45:54.684950Z mysqld_safe Starting mysqld daemon with databases from /mysql_test/mysql_3306
3.改密码
只能用update语句
mysql> update mysql.user set authentication_string=password('ningbo666') where user='root' and host='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
4.停止mysql
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
5.重启mysql
systemctl start mysql
再次登录
[root@db-51 ~]#mysql -uroot -pwww.yuchaoit.cn
授权表参数,会导致任意客户端,都可以免密直接登录,务必要记住要删掉DDL数据定义,全称为Data Definition Language
DQL数据查询语言,DQL,全称为Data Query Language
DCL授权控制,全称为Data Control Language
DML数据操作语言,DML,全称为Data Manipulation Language,中文为数据操作语言# 登录数据库
[root@mysql-server56 ~]#
[root@mysql-server56 ~]# mysql -S /data/3307/mysql.sock
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@mysql-server56 ~]# mysql -pyuchao7777 -S /data/3307/mysql.sock
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.6.40-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
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.
# 这句SQL翻译是从mysql库下的user表,查询user、host字段的数据、且对user排序
# 这就像我们用excel一样
mysql> select user,host from mysql.user order by user;
+------+----------------+
| user | host |
+------+----------------+
| | localhost |
| | mysql-server56 |
| root | localhost |
| root | mysql-server56 |
| root | 127.0.0.1 |
| root | ::1 |
| root | % |
+------+----------------+
7 rows in set (0.00 sec)# 删除这些无用的用户
# 发现删除了2个空用户
mysql> delete from mysql.user where user=' ';
Query OK, 2 rows affected (0.00 sec)
mysql> delete from mysql.user where user='root' and host='mysql-server56';
Query OK, 1 row affected (0.00 sec)
mysql> delete from mysql.user where user='root' and host='::1';
Query OK, 1 row affected (0.00 sec)
# 剩下来的用户
mysql> select user,host from mysql.user order by user;
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
| root | 127.0.0.1 |
| root | % |
+------+-----------+
3 rows in set (0.00 sec)mysql> create user pyyu@'%' identified by 'pyyu668';
Query OK, 0 rows affected (0.01 sec)
# 普通用户被创建的时候,默认有USAGE权限,只能用于登录数据库,无其他权限
mysql> show grants for pyyu@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for pyyu@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pyyu'@'%' IDENTIFIED BY PASSWORD '*4896EFB7643861D41A6BF9CD6FF012B785508323' |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# 只给pyyu用户查看luffy数据库的查询权限
mysql> grant select on luffy.* to 'pyyu'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
# 查询该用户的权限
mysql> show grants for pyyu@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for pyyu@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pyyu'@'%' IDENTIFIED BY PASSWORD '*4896EFB7643861D41A6BF9CD6FF012B785508323' |
| GRANT SELECT ON `luffy`.* TO 'pyyu'@'%' WITH GRANT OPTION |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)# 这句SQL意为创建luffy数据库,且设置数据库编码为utf8,且大小写不敏感,a和A一样处理
mysql> create database if not exists luffy default charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| luffy |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)mysql> ? Data Definition
You asked for help about help category: "Data Definition"
For more information, type 'help <item>', where <item> is one of the following
topics:
ALTER DATABASE
ALTER EVENT
ALTER FUNCTION
ALTER LOGFILE GROUP
ALTER PROCEDURE
ALTER SERVER
ALTER TABLE
ALTER TABLESPACE
ALTER VIEW
CONSTRAINT
CREATE DATABASE
CREATE EVENT
CREATE FUNCTION
CREATE INDEX
CREATE LOGFILE GROUP
CREATE PROCEDURE
CREATE SERVER
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE VIEW
DROP DATABASE
DROP EVENT
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP SERVER
DROP TABLE
DROP TABLESPACE
DROP TRIGGER
DROP VIEW
RENAME TABLE
TRUNCATE TABLEmysql> ? Account Management
You asked for help about help category: "Account Management"
For more information, type 'help <item>', where <item> is one of the following
topics:
ALTER USER
CREATE USER
DROP USER
GRANT
RENAME USER
REVOKE
SET PASSWORDmysql> ? Data Manipulation
You asked for help about help category: "Data Manipulation"
For more information, type 'help <item>', where <item> is one of the following
topics:
CALL
DELETE
DO
DUAL
HANDLER
INSERT
INSERT DELAYED
INSERT SELECT
JOIN
LOAD DATA
LOAD XML
REPLACE
SELECT
UNION
UPDATEmysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> show create database mysql;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| mysql | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)数据库.数据表名
列
列名
列属性:数据类型、约束条件、其他属性
行
字段名
字段属性mysql> select Host,User from mysql.user;
+-----------+---------------+
| Host | User |
+-----------+---------------+
| 10.0.0.% | dev01 |
| 10.0.0.% | yuchao02 |
| 10.0.0.7 | bob01 |
| localhost | chaoge01 |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
| localhost | yuchao01 |
+-----------+---------------+
8 rows in set (0.00 sec)# 查看mysql支持哪些字符集
mysql> show character set;
# 查看当前mysql服务端,默认是什么字符集
# 字符集(character set):定义了字符以及字符的编码。
mysql> show variables like '%char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql5.7.28/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
# 查看mysql默认的字符序
# 字符序(collation):定义了字符的比较规则。
mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum(
完整写法(可以解决数据库已存在的冲突)
create database if not exists kings default charset utf8mb4 ;
基本写法
create database yuchao_linux charset utf8;
create database yuchao_linux charset utf8mb4;mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | # 系统自带库,存储数据库内置信息
| kings |
| luffy |
| mysql | # 自带库,存储用户信息,授权等
| performance_schema | # 存储和性能相关的数据
| test |
+--------------------+
# 查看show create帮助信息
help show create database
具体用法,查看建库的语句,可以复用
show create database yuchao_linux;
show create database kings;# 创建数据库以及指定字符集,校验规则
1. 字符集,character set,就是一套表示字符的符号和这些的符号的底层编码;
2. 校验规则,则是在字符集内用于比较字符的一套规则。
# 查看当前数据库支持的字符集
# maxlen表示要用最大多少个字节来存储字符集的单个词,default collation表示该字符集的默认校验规则。
show character set;
# 查询mysql数据库所支持字符集的校验规则
show collation;
# 先简单了解即可,在遇见不同语言,中英文,以及包含特殊符号的环境下,就需要查阅,调整数据库编码了
主流用法组合
utf8mb4 字符集
utf8mb4_general_ci排序规则mysql> show create database yuchao_linux;
+--------------+-----------------------------------------------------------------------+
| Database | Create Database |
+--------------+-----------------------------------------------------------------------+
| yuchao_linux | CREATE DATABASE `yuchao_linux` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
# 修改数据库编码
mysql> alter database yuchao_linux charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> show create database yuchao_linux;
+--------------+--------------------------------------------------------------------------+
| Database | Create Database |
+--------------+--------------------------------------------------------------------------+
| yuchao_linux | CREATE DATABASE `yuchao_linux` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+--------------+--------------------------------------------------------------------------+
1 row in set (0.00 sec)[root@db-51 ~]#cat /etc/my.cnf
[mysqld]
character_set_server=utf8mb4
port=3306
user=mysql
basedir=/opt/mysql
datadir=/mysql_test/mysql_3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
重启
[root@db-51 ~]#systemctl restart mysqlmysql> create database kings_linux;
Query OK, 1 row affected (0.00 sec)
mysql> show create database kings_linux;
+-------------+-------------------------------------------------------------------------+
| Database | Create Database |
+-------------+-------------------------------------------------------------------------+
| kings_linux | CREATE DATABASE `kings_linux` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+-------------+-------------------------------------------------------------------------+
1 row in set (0.00 sec)1.创建表
a.表名的规范
不得数字开头
见名知意,表和业务有关,参考wordpress等数据库命名规范,如yuchaoit_post
不得大写字母
别超过18个字符
别是mysql默认关键字
b. 默认存储引擎是innodb
c. 5.7之后,数据表字符集,默认utf8mb4
d. 数据表的字段(列)也和业务有关,字符别超过18个
e. 数据表的字段(列)要选择合适的、足够容量、省磁盘空间的数据类型
f. 数据表的字段(列)建议都not null
g. 数据表的字段(列)建议都要有注释
h. 数据表的字段(列) 每张数据表都建议加主键
i. 针对not null的列,一般给与默认值
j. 给每张表添加注释mysql> create database d1;
Query OK, 1 row affected (0.00 sec)
mysql> show create database d1;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| d1 | CREATE DATABASE `d1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
# 该特殊符号 /*!40100 是mysql为了兼容不同版本的字符集,自动生成的一个注释信息,忽略即可,不需要你去写help create table;
CREATE TABLE `students` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(64) NOT NULL COMMENT '学生姓名',
`age` tinyint(3) NOT NULL DEFAULT '0' COMMENT '学生年龄',
`gender` enum('男','女') NOT NULL COMMENT '学生性别',
`address` enum('北京','深圳','云南','江苏') NOT NULL COMMENT '省份',
`intime` datetime NOT NULL COMMENT '入学时间',
`phone` char(11) NOT NULL COMMENT '手机号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;int 整数,有符号 -2^31 到 2^31-1 (-2147483648 ~ 2147483647 )
tinyint 最小整数,-128 到 127,如年龄
varchar 字符类型,变化长度,如身份证
char 字符类型,固定长度
enum 枚举类型,如性别二选一,三选一行不行?
datetime 时间类型,如下单时间,发表文章时间,注册时间等
# 简单玩一玩数据类型
# 玩玩int范围
mysql> create table t1(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values(2147483647);
Query OK, 1 row affected (0.01
mysql> create table stu_back like students;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+------------------------+
| Tables_in_yuchao_linux |
+------------------------+
| stu_back |
| students |
+------------------------+
2 rows in set (0.05 sec)
mysql> desc stu_back;
+---------+-----------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | NULL | |
| phone | char(11) | NO | | NULL | |
+---------+-----------------------------------+------+-----+---------+----------------+
7 rows in set (0.03 sec)# 给students表添加一个兴趣字段,hobby 要求只能输入20个汉字以内(20)
mysql> desc yuchao_linux.students;
+---------+-------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | NULL | |
| phone | char(11) | NO | | NULL | |
+---------+-------------------------------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
语法:
ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 字段约束 注释
案例
mysql> alter table yuchao_linux.students add column hobby char(20) not null default '学习' comment '学生爱好';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> alter table yuchao_linux.students add column height float(4,1) default null comment '学生身高' first;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc yuchao_linux.students;
+---------+-------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------------------------------------+------+-----+---------+----------------+
| height | float(4,1) | YES | | NULL | |
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | NULL | |
| phone | char(11) | NO | | NULL | |
| hobby | char(20) | NO | | 学习 | |
+---------+-------------------------------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)mysql> alter table yuchao_linux.students drop height;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
在性别后面添加 height身高字段
alter table yuchao_linux.students add column height float(4,1) default null comment '学生身高' after gender;删除字段
mysql>
mysql> alter table yuchao_linux.students drop hobby;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
危险操作,不能随便删除数据mysql> alter table students rename to new_students;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+------------------------+
| Tables_in_yuchao_linux |
+------------------------+
| new_students |
| stu_back |
+------------------------+
2 rows in set (0.00 sec)创建测试数据
create table t1(id int) engine=MYISAM;
mysql>
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> alter table t1 engine=innodb;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> alter table t1 charset=latin1;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
旧字段名:指修改前的字段名;
新字段名:指修改后的字段名;
新数据类型:指修改后的数据类型,如果不需要修改字段的数据类型,可以将新数据类型设置成与原来一样,但数据类型不能为空。
CHANGE 也可以只修改数据类型,实现和 MODIFY 同样的效果,方法是将 SQL 语句中的“新字段名”和“旧字段名”设置为相同的名称,只改变“数据类型”。
提示:由于不同类型的数据在机器中的存储方式及长度并不相同,修改数据类型可能会影响数据表中已有的数据记录,因此,当数据表中已经有数据时,不要轻易修改数据类型mysql> alter table stu_back change phone_num telephone_num varchar(11) NOT NULL DEFAULT '0' COMMENT '手机号';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> alter table stu_back change telephone_num telephone_num varchar(11) NOT NULL DEFAULT '15210858004' COMMENT '手机号';
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0alter table stu_back change phone phone_num varchar(11) not null default '0' comment '手机号';修改字段的数据类型就是把字段的数据类型转换成另一种数据类型。
在 MySQL 中修改字段数据类型的语法规则如下:
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
其中:
表名:指要修改数据类型的字段所在表的名称;
字段名:指需要修改的字段;
数据类型:指修改后字段的新数据类型。
修改telephone_num的数据类型,改为char(11)
注意,如果其他属性,不希望改变,也要加上,否则就丢失了
mysql> alter table stu_back modify telephone_num char(11) not null;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> drop table stu_back;
Query OK, 0 rows affected (0.00 sec)mysql> ? Data Manipulation
You asked for help about help category: "Data Manipulation"
For more information, type 'help <item>', where <item> is one of the following
topics:
CALL
DELETE
DO
DUAL
HANDLER
INSERT
INSERT DELAYED
INSERT SELECT
JOIN
LOAD DATA
LOAD XML
REPLACE
SELECT
UNION
UPDATE先看看表字段
mysql> desc new_students;
mysql> desc new_students;
+---------+-------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| height | float(4,1) | YES | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | NULL | |
| phone | char(11) | NO | | NULL | |
| hobby | char(20) | NO | | 学习 | |
+---------+-------------------------------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)insert into new_students(id,name,age,GENDER,HEIGHT,address,intime,phone,hobby) values(1,'杨松麟',22,'男','188.9','北京','2022-2-24','666666','说段子')
查数据
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+--------+-----------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+--------+-----------+
| 1 | 杨松麟 | 22 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 666666 | 说段子 |
+----+-----------+-----+--------+--------+---------+---------------------+--------+-----------+
1 row in set (0.00 sec)没写的字段,会填入默认值
datetime没有默认值,必须传入
id字段一般可以不写,会自动的增长+1
确保插入的字段,和值的顺序,是对应上的就行
char长度不能超出,否则报错,可以修改配置文件解决该问题
插入数据
insert into new_students(name,phone,age,intime) value("陈亮亮","123456789",21,"2022-2-23");
检查
mysql>
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+-----------+-----------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+-----------+-----------+
| 1 | 杨松麟 | 22 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 666666 | 说段子 |
| 2 | 陈亮亮 | 21 | 男 | NULL | 北京 | 2022-02-23 00:00:00 | 123456789 | 学习 |
+----+-----------+-----+--------+--------+---------+---------------------+-----------+-----------+
2 rows in set (0.00 sec)mysql> alter table new_students modify intime datetime not null default now() comment '用户添加的时间';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc new_students;
+---------+-------------------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------------------------------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| height | float(4,1) | YES | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | CURRENT_TIMESTAMP | |
| phone | char(11) | NO | | NULL | |
| hobby | char(20) | NO | | 学习 | |
+---------+-------------------------------------------+------+-----+-------------------+----------------+
9 rows in set (0.00 sec)mysql>
mysql> insert into new_students(phone,name) values("13911111111","李文杰");
Query OK, 1 row affected (0.00 sec)
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
| 1 | 杨松麟 | 22 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 666666 | 说段子 |
| 2 | 陈亮亮 | 21 | 男 | NULL | 北京 | 2022-02-23 00:00:00 | 123456789 | 学习 |
| 3 | 李文杰 | 0 | 男 | NULL | 北京 | 2022-07-21 02:05:42 | 13911111111 | 学习 |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
3 rows in set (0.00 sec)mysql> insert into new_students value(4,'郑佳强',18,'男','188.8','江苏','2020-2-25','13511111111','造火箭');
Query OK, 1 row affected (0.00 sec)
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
| 1 | 杨松麟 | 22 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 666666 | 说段子 |
| 2 | 陈亮亮 | 21 | 男 | NULL | 北京 | 2022-02-23 00:00:00 | 123456789 | 学习 |
| 3 | 李文杰 | 0 | 男 | NULL | 北京 | 2022-07-21 02:05:42 | 13911111111 | 学习 |
| 4 | 郑佳强 | 18 | 男 | 188.8 | 江苏 | 2020-02-25 00:00:00 | 13511111111 | 造火箭 |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------+
4 rows in set (0.00 sec)1.以班级学员信息,继续添加,试试SQL语句的insert
2. 有没有快捷的办法,批量插入数据?(提示,基于学生名字插入数据即可)
# 提示修改phone设置默认值
mysql -uroot -p123456 -e "alter table yuchao_linux.new_students modify phone char(11) not null default '0' "
# 测试代码
for stu in 叶金阳 杨松麟 陈亮亮 李文杰 郑佳强 罗兴林 冯靖涵 张少辉 程志伟 代杰豪 高若恒 张天鼎 张鑫 刘永飞 黄彦 王仁刚 赵阳阳 王秉诚 于超
do
mysql -uroot -p123456 -e "insert into yuchao_linux.new_students(name) values('$stu');" > /dev/null 2>&1
done
mysql -uroot -p123456 -e "select * from yuchao_linux.new_students "
mysql -uroot -p123456 -e "desc yuchao_linux.new_students"
# 清空表数据
mysql -uroot -p123456 -e "truncate table yuchao_linux.new_students "update new_students set address='云南' where name='李文杰';
mysql> update new_students set age=33 where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update new_students set age=18,address='北京',phone='13211111111',hobby='山西醋王' where name='杨松麟';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0mysql> update new_students set age=29,address='云南',phone='17711111111',hobby='山西段子王';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
update也是危险命令,,务必加上where条件!!删除郑佳强数据
mysql> delete from new_students where name='郑家强';
Query OK, 0 rows affected (0.00 sec)
注意看结果,提示没影响任何行记录,错误。
这才是正确的
mysql> delete from new_students where name='郑佳强';
Query OK, 1 row affected (0.00 sec)
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------------+
| 1 | 杨松麟 | 18 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 13211111111 | 山西醋王 |
| 2 | 陈亮亮 | 29 | 男 | NULL | 云南 | 2022-02-23 00:00:00 | 17711111111 | 山西段子王 |
| 3 | 李文杰 | 29 | 男 | NULL | 云南 | 2022-07-21 02:05:42 | 17711111111 | 山西段子王 |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+-----------------+
3 rows in set (0.00 sec)mysql> delete from new_students where hobby='山西段子王';
Query OK, 2 rows affected (0.00 sec)
mysql> select * from new_students;
+----+-----------+-----+--------+--------+---------+---------------------+-------------+--------------+
| id | name | age | gender | height | address | intime | phone | hobby |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+--------------+
| 1 | 杨松麟 | 18 | 男 | 188.9 | 北京 | 2022-02-24 00:00:00 | 13211111111 | 山西醋王 |
+----+-----------+-----+--------+--------+---------+---------------------+-------------+--------------+
1 row in set (0.00 sec)alter table new_students add column field_status TINYINT not null default 1 comment '字段删除状态,0 表示被删除,1表示数据存在';
mysql> desc new_students;
+--------------+-------------------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------------------------------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| age | tinyint(3) | NO | | 0 | |
| gender | enum('男','女') | NO | | NULL | |
| height | float(4,1) | YES | | NULL | |
| address | enum('北京','深圳','云南','江苏') | NO | | NULL | |
| intime | datetime | NO | | CURRENT_TIMESTAMP | |
| phone | char(11) | NO | | 0 | |
| hobby | char(20) | NO | | 学习 | |
| field_status | tinyint(4) | NO | | 1 | |
+--------------+-------------------------------------------+------+-----+-------------------+----------------+
10 rows in set (0.00 sec)删除于超数据
mysql> update new_students set field_status=0 where name='于超';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0drop table new_students;
1. 删除表所有数据,属于物理删除,释放磁盘空间(rm ibd)
2. 删除表定义(rm frm,表元数据也都被删除了)
truncate table new_students;
1. 保留表结构,清空表段中的数据页。
2. 属于物理删除,释放磁盘空间
delete from new_students;
1.逐行删除数据行,效率较低,保留表结构(如id的增长记录)
2. 属于逻辑删除,只是标记删除,不会立即清空磁盘
3. 因此delete会产生大量磁盘碎片1.查看前十个城市的信息
mysql> select * from city where id <10;
+----+----------------+-------------+---------------+------------+
| ID | Name | CountryCode | District | Population |
+----+----------------+-------------+---------------+------------+
| 1 | Kabul | AFG | Kabol | 1780000 |
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 4 | Mazar-e-Sharif | AFG | Balkh | 127800 |
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 7 | Haag | NLD | Zuid-Holland | 440900 |
| 8 | Utrecht | NLD | Utrecht | 234323 |
| 9 | Eindhoven | NLD | Noord-Brabant | 201843 |
+----+----------------+-------------+---------------+------------+
9 rows in set (0.00 sec)
District 区域
Population 人口数统计
mysql> select * from city where name='shanghai';
+------+----------+-------------+----------+------------+
| ID | Name | CountryCode | District | Population |
+------+----------+-------------+----------+------------+
| 1890 | Shanghai | CHN | Shanghai | 9696300 |
+------+----------+-------------+----------+------------+
1 row in set (0.00 sec)
mysql>mysql> select @@port;
+--------+
| @@port |
+--------+
| 3306 |
+--------+
1 row in set (0.00 sec)
mysql>
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> select @@basedir;
+-------------------+
| @@basedir |
+-------------------+
| /opt/mysql5.7.28/ |
+-------------------+
1 row in set (0.00 sec)
mysql> select @@datadir;
+------------------------------+
| @@datadir |
+------------------------------+
| /www.yuchaoit.cn/mysql_3306/ |
+------------------------------+
1 row in set (0.00 sec)
mysql> select @@socket;
+-----------------+
| @@socket |
+-----------------+
| /tmp/mysql.sock |
+-----------------+
1 row in set (0.00 sec)mysql> show variables like '%dir%';
+-----------------------------------------+----------------------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------------------+
| basedir | /opt/mysql5.7.28/ |
| binlog_direct_non_transactional_updates | OFF |
| character_sets_dir | /opt/mysql5.7.28/share/charsets/ |
| datadir | /www.yuchaoit.cn/mysql_3306/ |
| ignore_db_dirs | |
| innodb_data_home_dir | |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000 |
| innodb_tmpdir | |
| innodb_undo_directory | ./ |
| lc_messages_dir | /opt/mysql5.7.28/share/ |
| plugin_dir | /opt/mysql/lib/plugin/ |
| slave_load_tmpdir | /tmp |
| tmpdir | /tmp |
+-----------------------------------------+----------------------------------+
15 rows in set (0.00 sec)mysql> help Functions;
You asked for help about help category: "Functions"
For more information, type 'help <item>', where <item> is one of the following
categories:
Bit Functions
Comparison Operators
Control Flow Functions
Date and Time Functions
Encryption Functions
GROUP BY Functions and Modifiers
Information Functions
Locking Functions
Logical Operators
Miscellaneous Functions
Numeric Functions
Spatial Functions
String Functions# 当前在那个库下
mysql> select database();
+------------+
| database() |
+------------+
| world |
+------------+
1 row in set (0.00 sec)
# 当前系统时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2022-07-21 05:10:23 |
+---------------------+
1 row in set (0.00 sec)
# 当前连接的用户信息
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
# MySQL CONCAT()函数需要一个或多个字符串参数,并将它们连接成一个字符串。
mysql> select concat('www.','yuchaoit','.com');
+----------------------------------+
| concat('www.','yuchaoit','.com') |
+----------------------------------+
| www.yuchaoit.com |
+----------------------------------+
1 row in set (0.00 sec)
# 实际应用concat函数
mysql> select concat('mysql用户:',user,'@',host) from mysql.user;
+----------------------------------------+
| concat('mysql用户:',user,'@',host) |
+----------------------------------------+
| mysql用户:dev01@10.0.0.% |
| mysql用户:yuchao02@10.0.0.% |
| mysql用户:bob01@10.0.0.7 |
| mysql用户:chaoge01@localhost |
| mysql用户:mysql.session@localhost |
| mysql用户:mysql.sys@localhost |
| mysql用户:root@localhost |
| mysql用户:yuchao01@localhost |
+----------------------------------------+
8 rows in set (0.00 sec)
mysql>select 列
from 表
where 条件
group by 列
having 条件
order by 列
limit 条件mysql> use world;
mysql> select * from city;
mysql> select ID,Name,CountryCode,District,Population from city;语法1
select * from city where CountryCode='chn' or CountryCode='usa'
语法2
select * from city where CountryCode in ('chn','usa')select * from city where CountryCode IN ('CHN','USA') and Population > 5000000;
select * from city where (CountryCode='CHN' or CountryCode='USA') and Population>50000001 count() 统计数量
2 sum() 求和
3 avg() 平均数
4 max() 最大值
5 min() 最小值
6 group_concat() GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。# 统计中国每个省的城市个数,和城市名
# district 省
select District as 省,count(name) as 城市数量 ,GROUP_CONCAT(name) as 城市名列表 from city where CountryCode='CHN' group by District# Limit 起点,条数;
写法 1
select * from city where CountryCode='CHN' order by Population desc limit 5,5
写法2
select * from city where CountryCode='CHN' order by Population desc limit 5 offset 5SHOW语句有许多形式,提供关于服务器的数据库、表、列或状态信息的信息。
SHOW语法格式:
SHOW 关键字 LIKE 'pattern'
如果对于一个给定的说明语句的语法包括像'模式','模式'是一个字符串,可以包含“%”和“_“通配符。该模式是有用的限制语句输出匹配的值。
本节介绍以下:
SHOW DATABASES – 显示当前所有数据库的名称
SHOW TABLES FROM db_name – 显示数据库中的所有表
SHOW ENGINES – 显示MySQL当前支持哪些存储引擎和默认存储引擎
SHOW CHARACTER SET – 显示MySQL当前支持哪些字符集
SHOW COLLATION – 显示MySQL支持字符集的排序规则
SHOW BINARY | MASTER – 显示二进制文件以及文件大小(需要开启二进制日志记录功能
SHOW BINLOG EVENTS – 显示二进制文件的执行过程
SHOW COLUMNS – 显示表的列信息(等同于DESC,需要先创建表)
SHOW CREATE DATABASES – 显示已经创建的库,创建时的语句
SHOW CREATE TABLE – 显示已经创建的表,创建时的语句
SHOW CREATE FUNTCION – 显示已经创建的函数,创建时的语句
SHOW CREATE PROCEDURE – 显示已经创建的存储过程,创建时的语句
SHOW CREATE TRIGGER - 显示已经创建的触发器,创建时的语句
SHOW CREATE VIEW – 显示已经创建的视图,创建时的语句
SHOW CREATE EVENTS – 显示已经创建的事件,创建时的语句
SHOW ENGINE – 显示存储引擎的详细信息
SHOW WARNINGS – 显示最后一个执行语句所产生的警告信息
SHOW ERRORS – 显示最后一个执行语句所产生的错误信息
SHOW EVENTS – 显示事件信息
SHOW GRANTS – 显示一个用户所拥有的权限
SHOW PROCESSLIST – 显示系统中正在运行的所有进程,普通用户只能查看自己的进行信息
SHOW PRIVILEGES – 显示MySQL所支持的所有权限,及权限可操作的对象
SHOW PLUGINS – 显示MySQL插件信息
SHOW MASTER STATUS – 显示Master当前正在使用的二进制信息
SHOW TABLE STATUS – 显示表属性信息
SHOW INDEX – 显示表索引信息
SHOW PROCEDURE STATUS – 显示存储过程信息
SHOW FUNCTION STATUS – 显示存储函数信息
SHOW TRIGGERS – 显示触发器信息
SHOW PROFILE and SHOW PROFILES – 显示执行语句的资源使用情况
SHOW SLAVE HOSTS – 显示Master主机上已注册的复制主机列表
SHOW SLAVE STATUS – 显示Slave主机状态信息
SHOW GLOBAL | SESSION STATUS – 显示MySQL状态变量信息
SHOW GLOBAL | SESSION VARIABLES – 显示MySQL系统变量信息# 查看中国城市的人口
# select name,Population from city where CountryCode='CHN';
# 查看黑龙江省人口信息
-- select name,Population from city where CountryCode='CHN' and District='heilongjiang'
# 查看人口数量大于1000000的城市
-- select * from city where Population >=1000000
# 模糊查询,查询城市名,以HE开头的
-- select * from city where name like 'HE%'
# 查询中国里,名字带有HE的城市信息
# 等于要用到一个表的2个字段同时匹配么
-- select * from city where CountryCode='CHN' and name like 'HE%'
# 查询中国、美国的城市信息
-- select * from city where CountryCode='CHN' or CountryCode='USA'
# 语法2
-- select * from city where CountryCode in ('CHN','USA')# 1.建库
create database school_db;
# 2.建表学生表
create table students(id int ,name varchar(10));
#3. 建表 成绩表
create table score(id int, score int);
# 4.表结构查看
desc students;
desc score;
# 5.数据插入
insert into students values(1,'yuchao'),(2,'zhangsan'),(3,'sanpang');
insert into score values(1,66),(2,88),(3,99)
# 6.单表数据查询
select * from students;
select * from score;
# 7.连表查询
# 查出于超的成绩
mysql> select students.name,score.score from students,score where students.id=score.id and students.name='yuchao';
+--------+-------+
| name | score |
+--------+-------+
| yuchao | 66 |
+--------+-------+
1 row in set (0.00 sec)题目:世界上小于100人口的城市是哪个国家的
# 分析
人口数量 城市名 国家名
# 分析表字段
desc city;
desc country;
desc countrylanguage;
# 人口数量
city.Population
# 城市名
city.name
# 国家名
country.name
# 三表关联的信息
# 结果
# 查阅人口数小于1000的城市名,国家名
select city.Population as 人口数 ,city.name as 城市名 ,country.name as 国家名 from city,country where city.CountryCode=country.code and city.Population<1000
# 以人口数,降序排序
select city.Population as 人口数 ,city.name as 城市名 ,country.name as 国家名 from city,country where city.CountryCode=country.code and city.Population<1000 order by city.Population desc# 需求,查阅人口数小于100的城市在什么国家,以及说什么语言?
# 分析
人口数、城市名、国家名、语言
city.Populication
city.name
country.name
countryLanguage.language
# 找出表关联字段
city.CountryCode
country.code
#结果
mysql>
mysql> select city.Population,city.name,country.name,countrylanguage.`Language` from city,country,countrylanguage where city.CountryCode=country.code and country.code=countrylanguage.CountryCode and city.Population<100;
+------------+-----------+----------+-------------+
| Population | name | name | Language |
+------------+-----------+----------+-------------+
| 42 | Adamstown | Pitcairn | Pitcairnese |
+------------+-----------+----------+-------------+
1 row in set (0.00 sec)---database,-B
转储几个数据库。
通常情况,mysqldump将命令行中的第1个名字参量看作数据库名,后面的名看作表名。
使用该选项,它将所有名字参量看作数据库名。
备份命令,尽量携带-B参数,会让sql更加完整
-B可以跟上多个数据库名,同时备份多个库
尽量结合gzip命令压缩
指定备份库,以及所有数据
[root@db-51 /opt]#mysqldump -uroot -p123456 -B world employees > /mysql_backup/world_employess.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.# 备份salaries工资表
root@db-51 /opt]#mysqldump -uroot -p123456 employees salaries > /mysql_backup/employees_salaries.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@db-51 /opt]#
[root@db-51 /opt]#ll /mysql_backup/ -h
total 433M
-rw-r--r-- 1 root root 162M Jul 21 17:37 all_db.sql
-rw-r--r-- 1 root root 111M Jul 21 17:40 employees_salaries.sql
-rw-r--r-- 1 root root 161M Jul 21 17:36 world_employess.sql# 备份库下的多个表
[root@db-51 /opt]#mysqldump -uroot -p123456 world city country > /mysql_backup/world_city_country.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@db-51 /opt]#
[root@db-51 /opt]#ll /mysql_backup/ -h
total 434M
-rw-r--r-- 1 root root 162M Jul 21 17:37 all_db.sql
-rw-r--r-- 1 root root 111M Jul 21 17:40 employees_salaries.sql
-rw-r--r-- 1 root root 214K Jul 21 17:48 world_city_country.sql
-rw-r--r-- 1 root root 161M Jul 21 17:36 world_employess.sql有些情况下会只需要表结构,不要数据,命令如下
--no-data,-d
不写表的任何行信息。
如果你只想转储表的结构这很有用。
# 备份world库下,所有的表结构
mysqldump -uroot -p123456 -d world > /mysql_backup/world_all_table_no_data.sql
# 只有建表语句而已了
grep -Ev '#|\*|--|^$' /mysql_backup/world_all_table_no_data.sql
# 单独备份某个表的结构
mysqldump -uroot -pwww.yuchaoit.cn -d world city > /mysql_backup/world_city_no_data.sql
grep -Ev '#|\*|--|^$' /mysql_backup/world_city_no_data.sql--no-create-info,-t
不写重新创建每个转储表的CREATE TABLE语句。
# 只要city表的数据
mysqldump -uroot -pwww.yuchaoit.cn -t world city > /mysql_backup/world_city_only_data.sql
grep -Ev '#|\*|--|^$' /mysql_backup/world_city_only_data.sql--master-data[=value]
该选项将二进制日志的位置和文件名写入到输出中。
该选项要求有RELOAD权限,并且必须启用二进制日志。
如果该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。
如果选项值等于2,CHANGE MASTER语句被写成SQL注释。
--single-transaction
一般和--master-data=2 结合使用,保证所有库、表的一致性。mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
6 rows in set (0.00 sec)mysql> select @@log_bin_basename;
+--------------------+
| @@log_bin_basename |
+--------------------+
| NULL |
+--------------------+
1 row in set (0.00 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 0 |
+-------------+
1 row in set (0.01 sec)[root@db-51 /mysql_backup]#cat /etc/my.cnf
[mysqld]
server_id=51 # 主机id,必须要区别于其他机器
# 开启binlog的参数,以及日志文件路径,最终格式是如 mysql-bin.000001
log_bin=/mysql_test/mysql_3306/logs/mysql-bin
character_set_server=utf8mb4
port=3306
user=mysql
basedir=/opt/mysql
datadir=/mysql_test/mysql_3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
[root@db-51 /mysql_backup]#[root@db-51 /mysql_backup]#mkdir /mysql_test/mysql_3306/logs/
[root@db-51 /mysql_backup]#chown -R mysql.mysql /www.yuchaoit.cn/
[root@db-51 /mysql_backup]#systemctl restart mysqld
[root@db-51 /mysql_backup]#mysql -uroot -p123456
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.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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 variables like '%log_bin%';
+---------------------------------+--------------------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------------------+
| log_bin | ON |
| log_bin_basename | /www.yuchaoit.cn/mysql_3306/logs/mysql-bin |
| log_bin_index | /www.yuchaoit.cn/mysql_3306/logs/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------------------------+
6 rows in set (0.00 sec)1. 事件描述
时间戳
server_id
加密方式
开始位置 start_pos
结束位置 end_pos
2.事件内容
修改类的操作,SQL语句,数据行的变化
重点,使用binlog主要关注
start_pos
end_pos
事件内容mysql> show variables like '%binlog%';
+--------------------------------------------+----------------------+
| Variable_name | Value |
+--------------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| log_statements_unsafe_for_binlog | ON |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+--------------------------------------------+----------------------+
22 rows in set (0.01 sec)对于DDL、DCL语句,直接将SQL本身记录到binlog中
对于DML : insert、update、delete 受到binlog_format参数控制。
SBR : Statement : 语句模式。之前版本,默认模式
RBR : ROW : 行记录模式。5.7以后,默认模式
MBR : mixed : 混合模式。mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.00 sec)mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 201 |
| mysql-bin.000002 | 201 |
| mysql-bin.000003 | 154 |
+------------------+-----------+
3 rows in set (0.00 sec)
mysql>mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)1.主动写入新数据
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> create database chaoge_linux;
Query OK, 1 row affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 337 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.写入表数据
mysql> create table chaoge_linux.students(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into chaoge_linux.students values(1);
Query OK, 1 row affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 785 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.确认上述的所有数据创建操作,属于mysql的一个完整事务,到执行commit命令。
mysql> commit;
Query OK, 0 rows affected (0.01 sec)mysql> show binlog events in 'mysql-bin.000003';
+------------------+-----+----------------+-----------+-------------+--------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------+
| mysql-bin.000003 | 4 | Format_desc | 51 | 123 | Server ver: 5.7.28-log, Binlog ver: 4 |
| mysql-bin.000003 | 123 | Previous_gtids | 51 | 154 | |
| mysql-bin.000003 | 154 | Anonymous_Gtid | 51 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000003 | 219 | Query | 51 | 337 | create database chaoge_linux |
| mysql-bin.000003 | 337 | Anonymous_Gtid | 51 | 402 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000003 | 402 | Query | 51 | 522 | create table chaoge_linux.students(id int) |
| mysql-bin.000003 | 522 | Anonymous_Gtid | 51 | 587 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000003 | 587 | Query | 51 | 655 | BEGIN |
| mysql-bin.000003 | 655 | Table_map | 51 | 714 | table_id: 108 (chaoge_linux.students) |
| mysql-bin.000003 | 714 | Write_rows | 51 | 754 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000003 | 754 | Xid | 51 | 785 | COMMIT /* xid=15 */ |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------+
11 rows in set (0.00 sec)1.确保当前是开启binlog的
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 785 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.创建库
mysql> create database linux0224;
Query OK, 1 row affected (0.00 sec)
mysql> use linux0224;
Database changed
create table user (
id int(11) not null auto_increment comment 'id',
name varchar(10) not null comment 'name',
age tinyint(4) not null comment 'age',
primary key (id)
) engine=innodb default charset=utf8mb4;
3.写入数据
insert into user(name,age) values
('于超',28),
('郑佳强',22),
('李文杰',24);
4.查看数据
mysql> select * from user;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 1 | 于超 | 28 |
| 2 | 郑佳强 | 22 |
| 3 | 李文杰 | 24 |
+----+-----------+-----+
3 rows in set (0.00 sec)
5.模拟某个大傻子,误删除了数据,如何恢复?
mysql> drop database linux0224;1. 截取从建库到删库之间的所有的binlog
2.先看看当前的binlog
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1795 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.找到linux0224库创建的位置
mysql> show binlog events in 'mysql-bin.000003';
找到日志记录,pos值850就是该数据库的创建起点
| mysql-bin.000003 | 850 | Query | 51 | 959 | create database linux0224
4.找到终点,pos值1688
| mysql-bin.000003 | 1688 | Query | 51 | 1795 | drop database linux0224
5.导出创建、删除之间的操作,也就是你要的数据
[root@db-51 ~]#mysqlbinlog --start-position=850 --stop-position=1688 /mysql_test/mysql_3306/logs/mysql-bin.000003 > /tmp/restore_linux0224.sql
6.截取的日志,进行回放,重新开关binlog
# 基于sql_log_bin 参数,临时关闭二进制日志写入,否则会重复加载恢复数据的日志
# 导入数据后,重新打开即可
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /tmp/restore_linux0224.sql
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)1.基于flush logs;生成新的binlog
2. 创建数据库
mysql> create database lol;
Query OK, 1 row affected (0.00 sec)
mysql> create table lol.tanke(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> show tables from lol;
+---------------+
| Tables_in_lol |
+---------------+
| tanke |
+---------------+
1 row in set (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2124 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.刷新日志
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)1. 当前日志刷新了,继续写入新日志
show master status;
insert into lol.tanke values(1),(2),(3),(4);
commit;
show master status;
flush logs;1.再来写入数据
show master status;
create table lol.fashi(id int);
insert into lol.fashi values(1),(2),(3),(4),(5);
commit;
show master status;
flush logs;1.再来写入数据
show master status;
insert into lol.fashi values(11),(22),(33),(44),(55);
commit;
2. 误删除
mysql>
mysql> drop database lol;
Query OK, 2 rows affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 588 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)思路:找到 关于你要恢复的这个lol,数据库,从创建该库,到删除lol之间的记录
1. 基于开始的日志,找pos起点位置
mysql> show binlog events in 'mysql-bin.000003';
| mysql-bin.000003 | 1860 | Query | 51 | 1951 | create database lol
基于事件,寻找删库的事件pos位置
mysql> show binlog events in 'mysql-bin.000006';
| mysql-bin.000006 | 499 | Query | 51 | 588 | drop database lol
2. 或者基于mysqlbinlog命令,分析二进制日志的 建库lol的时间,到删库之间所有的日志
[root@db-51 ~]#cd /mysql_test/mysql_3306/logs/
[root@db-51 /mysql_test/mysql_3306/logs]#mysqlbinlog --start-position=1860 --stop-position=499 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 > /tmp/restore-lol.sql
3.可以解密查看如上截取的日志,能找到最后的插入数据结果即可
[root@db-51 /mysql_test/mysql_3306/logs]#mysqlbinlog --base64-output=decode-rows -vv --start-position=1860 --stop-position=499 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 > restore-lol.log我们要恢复的逻辑是
1. 创建了lol库
2. 创建了 tanke fashi表,以及插入了数据
3. 删除了lol库,到这截止
检查数据,恢复数据
mysql> show databases;
mysql> show master status;
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /tmp/restore-lol.sql;
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from lol.fashi;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 11 |
| 22 |
| 33 |
| 44 |
| 55 |
+------+
10 rows in set (0.00 sec)
就很nice,数据回来了mysql> show binlog events; #只查看第一个binlog文件的内容
mysql> show binlog events in 'mysql-bin.000002';#查看指定binlog文件的内容
mysql> show binary logs; #获取binlog文件列表
mysql> show master status; #查看当前正在写入的binlog文件# 1.创建表
create table linux0224.bank(
name varchar(20),
money decimal(20, 2)
)charset=utf8;
# 2.插入数据
use linux0224;
insert into bank values("于超", 20000),("张飞", 6000);
# 3.执行事务,如存取钱的更新,update
begin;
update bank set money=money-3000 where name="于超";
update bank set money=money+3000 where name="张飞";
commit;
# 4.查询价格
mysql> select * from bank;
+--------+----------+
| name | money |
+--------+----------+
| 于超 | 17000.00 |
| 张飞 | 9000.00 |
+--------+----------+
2 rows in set (0.00 sec)# 故意的SQL写错,查看在一个事务下的SQL执行状态
begin;
update bank set money=money-3000 where name="于超";
update bank ssssssssset money=money+3000 where name="张飞";
rollback;
# 事务特性,实现了数据正确性,一致性
mysql>
mysql> select * from bank;
+--------+----------+
| name | money |
+--------+----------+
| 于超 | 17000.00 |
| 张飞 | 9000.00 |
+--------+----------+
2 rows in set (0.00 sec)语法规则
在 MYSQL 中事务处理主要有两种方法:
1)用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
mysql> show variables like '%commit%';
+-----------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------+-------+
| autocommit | ON | #
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | 5 |
| innodb_commit_concurrency | 0 |
| innodb_flush_log_at_trx_commit | 1 |
| slave_preserve_commit_order | OFF |
+-----------------------------------------+-------+
8 rows in set (0.00 sec)mysql> show variables like '%GTID%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
8 rows in set (0.00 sec)vim /etc/my.cnf 加入
[root@db-51 ~]#cat /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=true
log-slave-updates=ON
server_id=51
log_bin=/mysql_test/mysql_3306/logs/mysql-bin
character_set_server=utf8mb4
port=3306
user=mysql
basedir=/opt/mysql
datadir=/mysql_test/mysql_3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
# 重启
systemctl restart mysqld# 创建库以及查看GTID
mysql> create database gtid_db charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000001 | 338 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
# 创建表,再看gtid
mysql> use gtid_db;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 506 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
# 插入数据再看gtid状态,主动开启个事务看看
# 这个事务下,有3个数据插入动作
begin;
insert into t1 values(1);
insert into t1 values(2);
insert into t1 values(3);
commit;
# 可以看出,3个insert 作为了一个事务记录
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 941 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
# 查看binlog的事件记录
show binlog events in 'mysql-bin.000008';# 注意参数的添加,--skip-gtids ,不加mysql会进行gtid记录的幂等性检查,导入sql会报错
# 导出从建库,创建数据,的所有gtid记录,不需要记录pos了
mysqlbinlog --skip-gtids --include-gtids='ae068f82-06bc-11ed-839d-000c29b76f3a:1-3' /mysql_test/mysql_3306/logs/mysql-bin.000001 > /tmp/gtid_t1.sql1.删除数据库试试
mysql> drop database gtid_db;
Query OK, 1 row affected (0.00 sec)
# 删除动作也是一个事务
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1107 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1-4 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
# 查看binlog的事件
mysql> show binlog events in 'mysql-bin.000001';
2.恢复数据,注意关闭二进制日志的记录
set sql_log_bin=0;
source /tmp/gtid_t1.sql;
set sql_log_bin=1;RESET MASTER可以用来清除GTID的执行历史,全部清空。危险命令。。
删除某个日志
清除二进制日志需要BINLOG_ADMIN特权。
如果未使用--log-bin选项启动服务器以启用二进制日志记录,则此语句无效。
Examples:
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26';mysql> flush logs;
shell> mysqladmin flush-logs
shell> mysql -e "flush logs"
shell> mysqldump -F
# 自动刷新,max_binlog_size 超过binlog的容量后,自动刷新新日志 默认1G ,单位bytes
# https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html`
mysql> select @@max_binlog_size;
+-------------------+
| @@max_binlog_size |
+-------------------+
| 1073741824 |
+-------------------+
1 row in set (0.00 sec)# 常见做法是备份7天
mysql> show variables like '%expire%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| disconnect_on_expired_password | ON |
| expire_logs_days | 0 |
+--------------------------------+-------+
2 rows in set (0.00 sec)
# 设置
set GLOBAL expire_logs_days=7;mysql> show variables like 'general_log%';
+------------------+---------------------------------------+
| Variable_name | Value |
+------------------+---------------------------------------+
| general_log | OFF |
| general_log_file | /www.yuchaoit.cn/mysql_3306/db-51.log |
+------------------+---------------------------------------+
2 rows in set (0.01 sec)mysql> set global general_log = on;
Query OK, 0 rows affected (0.00 sec)
mysql> set global general_log = on;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'general_log%';
# 永久配置,则写入my.cnf即可备份所有库
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -F -A -B |gzip >/server/backup/mysqlbak_$(date+%F).sql.gz
备份某个库
mysqldump -uroot -p123456 -S /data/3306/mysql.sock -F -B oldboy|gzip >/server/backup/mysqlbak_$(date+%F).sql.gz
-F 备份前,刷新binlog日志,用于增量恢复
-B 备份指定的某些数据库
-A 备份所有库、表、数据-F 参数用于mysqldump全量备份后立即对binlog日志文件切割,生成一个新日志文件,且重新记录binlog日志,用于将来增量恢复,从新的binlog日志文件开始
利用-F能够立即切割出新的binlog文件
mysqldump -uroot -p123456 -F -B kings|gzip > /data/3307/$(date +%F).sql.gz[root@mysql-server56 3307]# mysqldump -uroot -p123456 -P3307 -h127.0.0.1 --master-data=1 kings --compact > /data/3307/master-data.sql
Warning: Using a password on the command line interface can be insecure.
[root@mysql-server56 3307]#
[root@mysql-server56 3307]# mysqldump -uroot -p123456 -P3307 -h127.0.0.1 --master-data=2 kings --compact > /data/3307/master-data.sql2
Warning: Using a password on the command line interface can be insecure.
[root@mysql-server56 3307]#
[root@mysql-server56 3307]#
[root@mysql-server56 3307]#
[root@mysql-server56 3307]#
[root@mysql-server56 3307]# ls /data/3307/master-data.sql*
/data/3307/master-data.sql /data/3307/master-data.sql2[root@mysql-server56 3307]# head -1 /data/3307/master-data.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120;
[root@mysql-server56 3307]# head -1 /data/3307/master-data.sql2
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120;# 1.数据准备
[root@db-51 ~]#mysql -uroot -p123456
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 18
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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 yc_linux charset utf8mb4;
Query OK, 1 row affected (0.01 sec)
mysql> use yc_linux;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit ;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1901 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
# 其实也会自动提交的crontab -e
0 0 * * 1 备份脚本
# 备份命令
# --single-transaction,给所有数据库加锁,防止数据写入,导致备份错误
# --master-data 将binlog的信息以注释形式备份
# -R 导出mysql自定义函数
# -E 导出events事件
# --triggers 导出所有数据表的触发器
mysqldump -uroot -p123456 -A --master-data=2 --single-transaction --max_allowed_packet=64M -R -E > /mysql_3306_backup/full_db_$(date +%F).sql30 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1901;
31
32 --查看当前gtid信息
[root@db-51 ~]#mysql -uroot -p123456
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 20
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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 master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 1901 | | | ae068f82-06bc-11ed-839d-000c29b76f3a:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
mysql>
use yc_linux;
create table t2(id int);
insert into t2 values(66),(77),(88);
commit ;
# 模拟次日下午有人误删除了数据库
drop database yc_linux;恢复周一全量备份的数据先
# 检查全备数据
[root@db-51 ~]#ls /mysql_3306_backup/full_db_2022-02-24.sql
/mysql_3306_backup/full_db_2022-02-24.sql
# 查看gtid的分割点
# 数据是从这里开始变化的
[root@db-51 ~]#grep 'SET @@GLOBAL.GTID_PURGED=' /mysql_3306_backup/full_db_2022-02-24.sql
SET @@GLOBAL.GTID_PURGED='ae068f82-06bc-11ed-839d-000c29b76f3a:1-8';
# 查看备份开始时,binlog的位置点
29
30 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1901;
31
32 --
# 截取日志
# 起点
# 从全量开始的下一个gtid,或者基于1901的pos值都可以
mysql-bin.000001
ae068f82-06bc-11ed-839d-000c29b76f3a:1-9
# 终点,删库的操作
# 由于有了gtid的记录
# 直接拿到删库的gtid事务id
[root@db-51 ~]#mysql -uroot -pwww.yuchaoit.cn -e "show binlog events in 'mysql-bin.000001'" |grep -B 1 "drop database yc_linux"
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql-bin.000001 2342 Gtid 51 2407 SET @@SESSION.GTID_NEXT= 'ae068f82-06bc-11ed-839d-000c29b76f3a:11'
mysql-bin.000001 2407 Query 51 2511 drop database yc_linux
# 日志截取(核心点了)
# 拿上一个记录即可,也就是删数据的前一个事务
# 恢复gtid的日志范围
# 也就是拿到了全量备份,次日的数据变化记录(截止到drop database 之前)
mysqlbinlog --skip-gtids --include-gtids='ae068f82-06bc-11ed-839d-000c29b76f3a:9-10' /www.yuchaoit.cn/mysql_3306/logs/mysql-bin.000001 > /mysql_3306_backup/restore_shizhan.sql# 1.关闭binlog,恢复无须记录
# 先恢复全量的数据
# 再恢复增量的binlog
# 结果就是查看t2会恢复吗,这是次日增量写入的数据
set sql_log_bin=0;
show tables from yc_linux;
source /mysql_3306_backup/full_db_2022-02-24.sql ;
source /mysql_3306_backup/restore_shizhan.sql ;
set sql_log_bin=1;mysql> use yc_linux;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_yc_linux |
+--------------------+
| t1 |
| t2 |
+--------------------+
2 rows in set (0.00 sec)
mysql> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)
mysql> select * from t2;
+------+
| id |
+------+
| 66 |
| 77 |
| 88 |
+------+
3 rows in set (0.01 sec)[root@db-51 ~]#ls -l /mysql_test/mysql_3306/world/
total 1016
-rw-r----- 1 mysql mysql 8710 Feb 24 15:09 city.frm
-rw-r----- 1 mysql mysql 606208 Feb 24 15:09 city.ibd
-rw-r----- 1 mysql mysql 9172 Feb 24 15:09 country.frm
-rw-r----- 1 mysql mysql 163840 Feb 24 15:09 country.ibd
-rw-r----- 1 mysql mysql 8702 Feb 24 15:09 countrylanguage.frm
-rw-r----- 1 mysql mysql 229376 Feb 24 15:09 countrylanguage.ibd
-rw-r----- 1 mysql mysql 67 Jul 21 2022 db.optmysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)mysql> show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name | Value |
+----------------------------------+--------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
4 rows in set (0.00 sec)# 配置好阿里云源,安装基础依赖包
yum install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL -y
# 下载软件且安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm -y
# 检查软件
[root@db-51 ~]#ls -l `which xtrabackup innobackupex`
lrwxrwxrwx 1 root root 10 Feb 26 09:27 /usr/bin/innobackupex -> xtrabackup
-rwxr-xr-x 1 root root 21659096 Nov 23 2017 /usr/bin/xtrabackupXtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。
因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录[root@db-51 ~]#
[root@db-51 ~]#cat /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=true
log-slave-updates=ON
server_id=51
log_bin=/mysql_test/mysql_3306/logs/mysql-bin
character_set_server=utf8mb4
port=3306
user=mysql
basedir=/opt/mysql
datadir=/mysql_test/mysql_3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
[root@db-51 ~]#innobackupex --user=root -S /tmp/mysql.sock --password=123456 /xtrabackup_data/
备份结果
220726 16:16:25 [00] Writing /xtrabackup_data/2022-07-26_16-16-23/xtrabackup_info
220726 16:16:25 [00] ...done
xtrabackup: Transaction log of lsn (882272378) to (882272387) was copied.
220726 16:16:25 completed OK!
查看数据
[root@db-51 ~]#ll /xtrabackup_data/
total 4
drwxr-x--- 18 root root 4096 Jul 26 16:16 2022-07-26_16-16-23
[root@db-51 ~]#ll /xtrabackup_data/2022-07-26_16-16-23/
total 77892
-rw-r----- 1 root root 425 Jul 26 16:16 backup-my.cnf
drwxr-x--- 2 root root 60 Jul 26 16:16 chaoge_linux
drwxr-x--- 2 root root 332 Jul 26 16:16 employees
drwxr-x--- 2 root root 48 Jul 26 16:16 gtid_db
-rw-r----- 1 root root 12966 Jul 26 16:16 ib_buffer_pool
-rw-r----- 1 root root 79691776 Jul 26 16:16 ibdata1
drwxr-x--- 2 root root 4096 Jul 26 16:16 jpress
drwxr-x--- 2 root root 20 Jul 26 16:16 kings
drwxr-x--- 2 root root 20 Jul 26 16:16 kings_linux
drwxr-x--- 2 root root 84 Jul 26 16:16 linux0224
drwxr-x--- 2 root root 88 Jul 26 16:16 lol
drwxr-x--- 2 root root 4096 Jul 26 16:16 mysql
drwxr-x--- 2 root root 8192 Jul 26 16:16 performance_schema
drwxr-x--- 2 root root 8192 Jul 26 16:16 sys
drwxr-x--- 2 root root 144 Jul 26 16:16 world
-rw-r----- 1 root root 63 Jul 26 16:16 xtrabackup_binlog_info
-rw-r----- 1 root root 117 Jul 26 16:16 xtrabackup_checkpoints
-rw-r----- 1 root root 563 Jul 26 16:16 xtrabackup_info
-rw-r----- 1 root root 2560 Jul 26 16:16 xtrabackup_logfile
drwxr-x--- 2 root root 76 Jul 26 16:16 yc_linux
drwxr-x--- 2 root root 20 Jul 26 16:16 yuanlai
drwxr-x--- 2 root root 20 Jul 26 16:16 yuchaoit_mysql
drwxr-x--- 2 root root 96 Jul 26 16:16 yuchao_linux停止日志监控
停止锁表
备份成功
以及备份的内容是
1. 配置文件的备份 backup-my.cnf
2. 各个数据库的备份
3. mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
xtrabackup_binlog_info
4. xtrabackup_checkpoints 备份的类型,LSN状态
5. 备份总体的日志 xtrabackup_info
6. 备份期间的事务日志 xtrabackup_logfile[root@db-51 ~]#cat /xtrabackup_data/2022-07-26_16-16-23/xtrabackup_binlog_info
mysql-bin.000002 194 ae068f82-06bc-11ed-839d-000c29b76f3a:1-81
也就等于服务端的binlog日志
mysql> show master status;
[root@db-51 ~]#cat /xtrabackup_data/2022-07-26_16-16-23/xtrabackup_checkpoints
backup_type = full-backuped # 全量备份
from_lsn = 0
to_lsn = 882272378
last_lsn = 882272387
compact = 0
recover_binlog_info = 0# 模拟数据删除,可以直接操作mysql数据目录
# 停止
[root@db-51 ~]#systemctl stop mysqld
[root@db-51 ~]#netstat -tunlp |grep 3306
# 挪走数据
[root@db-51 ~]#mv /mysql_test/mysql_3306/* /test_3306_data/在恢复数据之前,先执行如下命令,确保数据一致性,同时回滚未提交事务的日志数据
使用32M内存进行恢复,对内存限制,防止占用过多机器资源
--apply-log 读取redo日志
# 基于命令恢复,步骤1
innobackupex --apply-log --use-memory=32M /xtrabackup_data/full_2022-07-26/
# 步骤2,copy-back命令恢复
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /xtrabackup_data/full_2022-07-26/
# 步骤3,检查数据目录
[root@db-51 ~]#ls /mysql_test/mysql_3306/
# 步骤4,启动服务
注意权限的恢复
[root@db-51 ~]#chown -R mysql.mysql /mysql_test/mysql_3306/
[root@db-51 ~]#systemctl start mysqld[root@db-51 ~]#mysql -uroot -p123456
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 10
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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 xtraback_test charset utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use xtraback_test;
Database changed
mysql> create table full_t1(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into full_t1 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit ;
Query OK, 0 rows affected (0.00 sec)
mysql># 用户在网页中插入数据了,也是我们在全量备份之后的第一次数据写入,会被binlog记录,实现增量日志
[root@db-51 ~]#mysql -uroot -p123456
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 13
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> use xtraback_test;
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>
mysql> create table inc_t1(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into inc_t1 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql>[root@db-51 ~]#innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp --incremental-basedir=/xtrabackup_data/full_1_2022-07-26/ --incremental /xtrabackup_data/inc1_`date +%F`
正确备份的结果
220726 17:10:31 [00] Writing /xtrabackup_data/inc1_2022-07-26/backup-my.cnf
220726 17:10:31 [00] ...done
220726 17:10:31 [00] Writing /xtrabackup_data/inc1_2022-07-26/xtrabackup_info
220726 17:10:31 [00] ...done
xtrabackup: Transaction log of lsn (882272808) to (882272808) was copied.
220726 17:10:31 completed OK!
检查数据目录
[root@db-51 ~]#ls /xtrabackup_data/
2022-07-26_16-16-23 full_1_2022-07-26 full_2022-07-26 inc1_2022-07-26
对于增量备份的数据,是
从全备信息的的LSN开始读取redo日志,对改变的数据进行增量备份[root@db-51 ~]#mysql -uroot -p123456
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 20
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> use xtraback_test;
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> create table inc_t2(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into inc_t2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)[root@db-51 ~]#mysql -uroot -p123456
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 20
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> use xtraback_test;
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> create table inc_t2(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into inc_t2 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp --parallel=4 --incremental-basedir=/xtrabackup_data/inc1_2022-07-26 --incremental /xtrabackup_data/inc2_`date +%F`
查看数据备份
[root@db-51 ~]#ls /xtrabackup_data/
2022-07-26_16-16-23 full_1_2022-07-26 full_2022-07-26 inc1_2022-07-26 inc2_2022-07-26[root@db-51 ~]#mysql -uroot -p123456
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 23
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> use xtraback_test;
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> create table inc_t3(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into inc_t3 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.00 sec)innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --socket=/tmp/mysql.sock --no-timestamp --parallel=4 --incremental-basedir=/xtrabackup_data/inc2_2022-07-26 --incremental /xtrabackup_data/inc3_`date +%F`
检查备份
[root@db-51 ~]#ls /xtrabackup_data/
2022-07-26_16-16-23 full_1_2022-07-26 full_2022-07-26 inc1_2022-07-26 inc2_2022-07-26 inc3_2022-07-26
[root@db-51 /xtrabackup_data]#du -sh *
276M 2022-07-26_16-16-23
276M full_1_2022-07-26
392M full_2022-07-26
4.9M inc1_2022-07-26
4.9M inc2_2022-07-26
4.9M inc3_2022-07-26[root@db-51 /xtrabackup_data]#mysql -uroot -p123456
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 26
Server version: 5.7.28-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
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> use xtraback_test;
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> create table inc_t4(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into inc_t4 values(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> commit ;
Query OK, 0 rows affected (0.00 sec)
mysql># 周四今天,还未进行备份,数据库就出问题了
[root@db-51 /xtrabackup_data]#pkill mysqld
[root@db-51 /xtrabackup_data]#
[root@db-51 /xtrabackup_data]#
[root@db-51 /xtrabackup_data]#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1024/zabbix_agentd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1011/sshd
tcp6 0 0 :::10050 :::* LISTEN 1024/zabbix_agentd
tcp6 0 0 :::22 :::* LISTEN 1011/sshd
tcp6 0 0 :::8090 :::* LISTEN 19708/java
# 删除数据,全部mv移走即可,rm也行
[root@db-51 /xtrabackup_data]#mv /www.yuchaoit.cn/mysql_3306/* /test_3306_data/1.想清楚你目前有哪些备份的数据
[root@db-51 /xtrabackup_data]#ls /xtrabackup_data/ -l
total 24
drwxr-x--- 18 root root 4096 Jul 26 16:16 2022-07-26_16-16-23
drwxr-x--- 20 root root 4096 Jul 26 16:59 full_1_2022-07-26 # 有这个全量备份的binlog
drwxr-x--- 19 root root 4096 Jul 26 16:39 full_2022-07-26
drwxr-x--- 20 root root 4096 Jul 26 17:10 inc1_2022-07-26 # 增量1的binlog
drwxr-x--- 20 root root 4096 Jul 26 17:31 inc2_2022-07-26 # 增量2的binlog
drwxr-x--- 20 root root 4096 Jul 26 17:39 inc3_2022-07-26 # 增量3 的binlog
2. 恢复思路
- 先恢复全量备份
- 依次合并增量的日志到全备日志里
- 最终利用--copy-back参数 恢复 完整的所有日志
- 恢复周四的增量数据
- 完成所有数据恢复
shell
3.提醒,这里要实现增量备份,务必保存好之前的binlog,修改配置文件,修改binlog的存储路径
[root@db-51 /xtrabackup_data]#du -sh *
276M 2022-07-26_16-16-23
276M full_1_2022-07-26
392M full_2022-07-26
4.9M inc1_2022-07-26
4.9M inc2_2022-07-26
4.9M inc3_2022-07-26--apply-log:该选项表示同xtrabackup的--prepare参数
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。
因此,此时数据 文件仍处理不一致状态。
--apply-log
作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。
注意,只要不是最后一次合并增量数据,就要加--redo-only参数,作用是只应用redo日志恢复数据,不执行undo回滚未提交的数据。[root@db-51 ~]#cd /xtrabackup_data/
innobackupex --apply-log --redo-only --incremental-dir=inc1_2022-07-26 full_1_2022-07-26/
合并完毕后,检查结果
[root@db-51 /xtrabackup_data]#cat full_1_2022-07-26/xtrabackup_checkpoints |grep 'to_lsn'
to_lsn = 882272808
[root@db-51 /xtrabackup_data]#cat inc1_2022-07-26/xtrabackup_checkpoints |grep 'to_lsn'
to_lsn = 882272808innobackupex --apply-log full_1_2022-07-26/
整个流程,都得看到结尾的
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 882273339
220726 18:38:35 completed OK!# 确认数据库还是宕机 的状态
[root@db-51 ~]#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1024/zabbix_agentd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1011/sshd
tcp6 0 0 :::10050 :::* LISTEN 1024/zabbix_agentd
tcp6 0 0 :::22 :::* LISTEN 1011/sshd
tcp6 0 0 :::8090 :::* LISTEN 19708/java
[root@db-51 ~]#
[root@db-51 ~]#
[root@db-51 ~]#
[root@db-51 ~]#
[root@db-51 ~]#ls /mysql_test/mysql_3306/
# 恢复数据
[root@db-51 ~]#innobackupex --copy-back /xtrabackup_data/full_1_2022-07-26/
[root@db-51 ~]#du -sh /wmysql_test/mysql_3306/
384M /mysql_test/mysql_3306/
# 根据my.cnf的设置,还得创建数据库
[root@db-51 ~]#mkdir /mysql_test/mysql_3306/logs -p
[root@db-51 ~]#touch /mysql_test/mysql_3306/logs/mysql.err
[root@db-51 ~]#chown -R mysql.mysql /mysql_test/
# 重启
[root@db-51 ~]#systemctl restart mysqld
[root@db-51 ~]#!net
netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 1024/zabbix_agentd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1011/sshd
tcp6 0 0 :::10050 :::* LISTEN 1024/zabbix_agentd
tcp6 0 0 :::3306 :::* LISTEN 31694/mysqld
tcp6 0 0 :::22 :::* LISTEN 1011/sshd
tcp6 0 0 :::8090 :::* LISTEN 19708/java
[root@db-51 ~]#目前只还原了全量+inc_1 + inc_2 + inc_3 的数据
mysql> show tables from xtraback_test;
+-------------------------+
| Tables_in_xtraback_test |
+-------------------------+
| full_t1 |
| inc_t1 |
| inc_t2 |
| inc_t3 |
+-------------------------+
4 rows in set (0.00 sec)
mysql>1. 找到inc_3日志的截止点,作为起点
[root@db-51 ~]#cat /xtrabackup_data/inc3_2022-07-26/xtrabackup_binlog_info
mysql-bin.000003 2274 ae068f82-06bc-11ed-839d-000c29b76f3a:1-90
2.查看之前的binlog,也就是找到t4表的binlog记录,可以看到t4表的数据插入
[root@db-51 /test_3306_data/logs]#mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000001
3. 日志截取, 从inc3的开始,然后提取binlog,就只拿到t4表的数据创建了!!!
mysqlbinlog --skip-gtids --start-position=2274 /test_3306_data/logs/mysql-bin.000003 > /tmp/t4.sql
4.此时的sql文件,就是从inc3增量备份后,次日数据写入的binlog记录了!!可以恢复了!!mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /tmp/t4.sql;
mysql> set sql_log_bin=1;mysql> select * from xtraback_test.inc_t4;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.00 sec)1. 清空所有日志
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
2.立即全量备份
innobackupex --no-timestamp --user=root -S /tmp/mysql.sock --password=123456 /xtrabackup_data/full_all_bak_`date +%F`cat > /etc/my.cnf<<EOF
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=51
log_bin=/binlog/mysql-bin
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
启动
初始化数据
[root@db-51 ~]#ls -d /opt/mysql*
/opt/mysql /opt/mysql5.7.28
[root@db-51 ~]#which mysql
/opt/mysql/bin/mysql
mkdir -p /data/mysql_3306/
mkdir -p /var/log/mysql/
mkdir -p /binlog/
chown -R mysql.mysql /data/ /var/log/mysql/ /binlog/
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/
# 启动
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
mysql -e "select version()"# db-52配置
cat > /etc/my.cnf<<EOF
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=52
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
启动
[root@db-52 /opt]#ls /opt
mysql mysql-5.7.28-linux-glibc2.12-x86_64 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz
echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile
source /etc/profile
mysql -V
mkdir -p /data/mysql_3306/
mkdir -p /var/log/mysql/
useradd -s /sbin/nologin -M mysql
chown -R mysql.mysql /data/ /var/log/mysql/
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/
# 启动
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
systemctl daemon-reload
systemctl restart mysqld
mysql -e "select version()"cat > /etc/my.cnf<<EOF
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=53
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
启动
[root@db-53 /opt]#ln -s /opt/mysql-5.7.28-linux-glibc2.12-x86_64 /opt/mysql
echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile
source /etc/profile
mysql -V
mkdir -p /data/mysql_3306/
mkdir -p /var/log/mysql/
useradd -s /sbin/nologin -M mysql
chown -R mysql.mysql /data/ /var/log/mysql/
mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql --datadir=/data/mysql_3306/
# 启动
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
systemctl daemon-reload
systemctl restart mysqld
mysql -e "select version()"[root@db-51 ~]#mysql -e "show variables like 'log_bin'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+1.主库设置个密码
mysqladmin password 123456
2.创建复制用户
mysql -uroot -p123456 -e "grant replication slave on *.* to 'repl'@'10.0.0.%' identified by '123456';"
3.查看用户
mysql -uroot -p123456 -e "select user,host,plugin from mysql.user"
4.查看权限
mysql -uroot -p123456 -e "show grants for repl@'10.0.0.%'"# 备份命令
# -A 备份所有库表
# --single-transaction,给所有数据库加锁,防止数据写入,导致备份错误
# --master-data=2 将binlog的信息以注释形式备份
# -R 导出mysql自定义函数
# -E 导出events事件
# --triggers 导出所有数据表的触发器
mysqldump -uroot -p123456 -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M > /data/full.sql
# 发给slave
for i in 52 53 ;do scp /data/full.sql 10.0.0.$i:/opt/;done先查看binlog的截止点
[root@db-52 ~]#sed -n '19,22p' /opt/full.sql
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=704;# -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=704;
change master to
master_host='10.0.0.51',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=704,
master_connect_retry=10;
# 启动slave复制
start slave;mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 1 | system user | | NULL | Connect | 807 | Waiting for master to send event | NULL |
| 2 | system user | | NULL | Connect | 742 |
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 485
Relay_Log_File: db-53-relay-bin.000005
Relay_Log_Pos: 698
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes中继日志 relay-log
命名方式
datadir/hostname-relay-bin.xxxxx
[root@db-53 ~]#ls /data/mysql_3306/ -l |grep relay
-rw-r----- 1 mysql mysql 373 Jul 29 00:26 db-53-relay-bin.000004
-rw-r----- 1 mysql mysql 698 Jul 29 00:27 db-53-relay-bin.000005
-rw-r----- 1 mysql mysql 50 Jul 29 00:26 db-53-relay-bin.index
-rw-r----- 1 mysql mysql 61 Jul 29 00:27 relay-log.info
[root@db-53 ~]#
作用:
存储获取到的binlog信息[root@db-53 ~]#cat /data/mysql_3306/master.info
25
mysql-bin.000004
485
10.0.0.51
repl
www.yuchaoit.cn
3306
10
0
0
30.000
0
d8710e0b-0da9-11ed-bac3-000c29b76f3a
86400
0
[root@db-53 ~]#
作用:
记录主库ip,port,user,密码,binlog位置点灯信息记录SQL,线程回放的位置
[root@db-53 ~]#cat /data/mysql_3306/relay-log.info
7
./db-53-relay-bin.000005
698
mysql-bin.000004
485
0
0
1mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 53 | | 3306 | 51 | 97630496-0def-11ed-8051-000c291bb766 |
| 52 | | 3306 | 51 | 96c4afb2-0dee-11ed-bcc5-000c294c7d18 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)# 查看从库复制状态
show slave status \G
# 查看主库连接信息、以及binlog、pos值等
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.51
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 485
# 擦看relay-log回放的信息
Relay_Log_File: db-53-relay-bin.000005
Relay_Log_Pos: 698
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
# 线程状态信息,这个状态不对,复制就有问题
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep -E 'IO|SQL'
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
# 提取复制相关信息
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep -E 'Replicate'
mysql: [Warning] Using a password on the command line interface can be insecure.
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Replicate_Ignore_Server_Ids:
Replicate_Rewrite_DB:
# 落后主库的秒数
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep -E 'Behind'
mysql: [Warning] Using a password on the command line interface can be insecure.
Seconds_Behind_Master: 0
# 关于GTID的信息
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep -E 'Gtid|Auto'
mysql: [Warning] Using a password on the command line interface can be insecure.
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep 'Relay_Log_'
mysql: [Warning] Using a password on the command line interface can be insecure.
Relay_Log_File: db-53-relay-bin.000005
Relay_Log_Pos: 698
Relay_Log_Space: 1071[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep '_Master'
mysql: [Warning] Using a password on the command line interface can be insecure.
Read_Master_Log_Pos: 485
Relay_Master_Log_File: mysql-bin.000004
Exec_Master_Log_Pos: 485
Seconds_Behind_Master: 0
# 用于计算主从复制的延时日志量Slave_IO_Running: Yes # IO线程工作状态,yes,no,connection三个状态
Slave_SQL_Running: Yes # SQL工作状态,yes ,no
Last_IO_Error: # IO故障代码,2003,1045,1040,1593,1236
Last_SQL_Errno: 0 # SQL线程故障代码,1008,1007
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "show slave status\G" |grep 'Error'
mysql: [Warning] Using a password on the command line interface can be insecure.
Last_Error:
Last_IO_Error:
Last_SQL_Error:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:网络波动
master 连接信息错误,如端口,用户,密码,授权规则错误,复制无权限
防火墙拒绝请求
主机连接数到达上限
[root@db-53 /data/mysql_3306]#mysql -uroot -p123456 -e "select @@max_connections;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------+
| @@max_connections |
+-------------------+
| 151 |
+-------------------+
master、slave版本不一,5.7 、8.0、 5.6· binlog_do_db:白名单,只对指定数据库进行binlog记录与复制,多个数据库设置可以写多行
· binlog_ignore_db:黑名单,此选项中指定的数据库将不进行binlog记录和复制,多个数据库设置可以写多行
[mysqld]
binlog_do_db=yuchao_db
binlog_do_db=chaoge_linux· replicate_do_db:数据库白名单列表,多个数据库用逗号分隔,该选项指定的数据库会执行主从复制操作
· replicate_ignore_db:数据库黑名单列表,该选项指定的数据库将不会被复制
· replicate_do_table:表级别的白名单
· replicate_ignore_table:表级别的黑名单
· replicate_wild_do_table:可以使用通配符进行指定表,如%代表所有
· replicate_wild_ignore_table:同上mysql > stop slave sql_thread;
mysql > change replication filter replicate_do_db=(yuchao_db,chaoge_linux);
mysql > start slave sql_thread;mysql> show master status
-> ;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 557 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql> show master status
-> ;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 1251 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)cat >/etc/my.cnf <<'EOF'
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=51
log_bin=/binlog/mysql-bin
autocommit=0
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOFcat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=52
autocommit=0
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOFcat > /etc/my.cnf <<EOF
[mysqld]
user=mysql
datadir=/data/mysql_3306
basedir=/opt/mysql/
socket=/tmp/mysql.sock
port=3306
log_error=/var/log/mysql/mysql.err
server_id=52
autocommit=0
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOFmysql> show global variables like '%gtid%';
+----------------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------------------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed | 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1 |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+----------------------------------------+
8 rows in set (0.00 sec)
mysql> show global variables like 'server%';
+----------------+--------------------------------------+
| Variable_name | Value |
+----------------+--------------------------------------+
| server_id | 51 |
| server_id_bits | 32 |
| server_uuid | 7588844c-0eb4-11ed-bfb7-000c29b76f3a |
+----------------+--------------------------------------+
3 rows in set (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000002 | 444 | | | 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)# 写入数据
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000002 | 444 | | | 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> create database happy_yu;
Query OK, 1 row affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 | 615 | | | 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
mysql> create database happy_yu2;
Query OK, 1 row affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 | 789 | | | 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 789
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 7588844c-0eb4-11ed-bfb7-000c29b76f3a:1-3
1 row in set (0.00 sec)