第六周-云计算运维作业
1. 总结关系型数据库相关概念,关系,行,列,主键,惟一键,域。
概念:
实体是现实世界中的对象或概念,通过数据库进行建模。
对象类型(或实体类型) 定义了一类具有相似属性的实体,是对实体特征的抽象描述。
关系(或表) 在数据库中对应实体类型,表中的每行表示一个实体实例,每列表示实体的属性。
关系型数据库使用二维表来存储
每个关系对应数据库中的一个实体或一个对象类型
每一个行都为一个记录(实体例),每一列为实体的一个属性(实体属性)
行/列
行是一条完整的记录,表示一个实体实例,每行包含了实体实例的多个属性值
例子:学生信息表中的id、姓名、学号,这些属性的属性值称为行
列表是表中的一个属性,每列都有一个名称和数据类型
列定义表中所有行数据都必须具备的特性
例子:学生信息表中的,列可以是学生ID、姓名、年龄和班级
主键
主键是表中的一个或多个列,其值唯一标识表中的每一行(保证每行的唯一性)
主键约束确保每行都有唯一的标识符,不能有重复值,也不能为空值(NULL)。
例子:学生ID可以作为主键,因为每个学生都有唯一ID
唯一键
唯一键是表中的一个或多个列,其值在表中必须是唯一的,可以有多个唯一键。
唯一键允许空值,但每列中的非空值必须是唯一的。
唯一键确保独立列中每个属性值不重复,而主键确保整行的唯一
域
域是指列可能包含的值的集合,定义了列的数据类型和有效值范围。
域限制了列中可以存储的数据类型,如整数、字符串、日期等。
2. 总结关联类型,1对1,1对多,多对多关系。可以自行设计表进行解释。
1对1:
姓名 | ID |
---|---|
Bxx | 2111345 |
Cxx | 2111444 |
定义:
一对一关系是指一个实体实例只能关联到另一个实体实例,反之亦然。
在数据库中,一对一关系通常通过在一个表中添加外键来实现,或者将两个实体的主键设为相同
1对多:
书 | 作者 |
---|---|
XXX1 | Axxx |
XX3 | Axxx |
XXX34 | Axxx |
定义:
一对多关系是指一个实体实例可以关联到多个其他实体实例,但反过来则不成立。
在数据库中,一对多关系通过在多的一方的表中添加外键来实现。
多对多:
姓名 | 课程 |
---|---|
Bxx | php |
Cxx | php |
Bxx | java |
Bxx | mysql |
定义:
多对多关系是指多个实体实例可以关联到多个其他实体实例。
在数据库中,多对多关系通过创建一个中间表(连接表)来实现,该表包含两个外键,分别引用关联的两个表。
3. 总结mysql设计范式
第一范式(1NF)
要求:
每个表都有一个主键。
每个列中的值都是不可再分的原子值。
第二范式(2NF)
满足1NF,且每个非主属性完全依赖于主键。
要求:
满足1NF。
表中的每个非主键列都必须完全依赖于主键,而不能是部分依赖。
第三范式(3NF)
定义:满足2NF,且每个非主属性不传递依赖于主键。
要求:
满足2NF。
表中的每个非主键列都不能传递依赖于主键。
总结:
表中除主键外的值都必须依赖于主键,如果存在主键是多位,必须全依赖,不能只依赖主键中的一位;
4. 总结Mysql多种安装方式,及安全加固,并总结mysql配置文件。1. 完成将server和client端的mysql配置默认字符集为utf8mb4;
- 使用二进制包安装
官网:https://dev.mysql.com/downloads/mysql/
下载 MySQL 二进制包:
https://dev.mysql.com/downloads/mysql/
解压缩二进制包:
tar -xvf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
移动并设置权限:
#将解压后的文件夹移动到 /usr/local/ 或者其他合适的位置。
sudo mv mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql
sudo chown -R mysql:mysql /usr/local/mysql
初始化数据库:
/usr/local/mysql/bin/mysqld --initialize --user=mysql
启动 MySQL:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
设置环境变量:
添加 MySQL 二进制目录到系统 PATH 中。
export PATH=$PATH:/usr/local/mysql/bin
写入systemctl
-
使用包管理器安装
系统:rcok8 mariadbyum install mariadb-server
-
使用源码编译安装
安装编译工具和依赖:
yum install build-essential cmake libncurses5-dev
下载 MySQL 源码:
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.26.tar.gz
tar -xvf mysql-8.0.26.tar.gz
cd mysql-8.0.26
配置和编译:
make
make install
初始化数据库:
/usr/local/mysql/bin/mysqld --initialize --user=mysql
启动 MySQL:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
安全加固:
/usr/local/mysql/bin/mysql_secure_installation #自带的安全脚本
设置 root 密码:确保 MySQL root 用户有一个强密码。
移除匿名用户:删除允许任何人连接到数据库的匿名用户账户。
禁止 root 远程登录:防止 root 用户从远程主机登录。
移除测试数据库:删除默认的 test 数据库,该数据库可以被任何用户访问。
mysql配置文件(my.cnf)
配置文件由多个部分组成,每个部分以 [section] 表示,其中定义了一组相关的配置选项
[client]: 客户端设置。
[mysqld_safe]: 包含用于启动mysqld的安全选项,如文件描述符限制。
[mysqld]: 服务端基本配置。
例子:
[client]#客户端
port=3306
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8mb4
port: 默认连接的端口。
socket: Unix socket 文件路径。
default-character-set: 客户端使用的默认字符集。
[mysqld]#服务器端配置选项。
port=3306
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
max_connections=150
port: MySQL 服务器监听的端口。
datadir: 数据文件的存储目录。
log-error: 错误日志的路径。
pid-file: PID 文件的路径。
character-set-server: 服务器使用的默认字符集。
collation-server: 服务器使用的默认排序规则。
sql_mode: SQL 模式配置。
max_connections: 最大同时连接数。
[mysqld_safe]#mysqld_safe 相关配置。
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-error: mysqld_safe 的错误日志路径。
pid-file: mysqld_safe 的 PID 文件路径。
完成将server和client端的mysql配置默认字符集为utf8mb4:
vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
[client]
character-set-client=utf8mb4
5. 掌握如何获取SQL命令的帮助,基于帮助完成添加testdb库,字符集utf8, 排序集合utf8_bin.创建host表,字段(id,host,ip,cname等)
获取 MySQL 命令的帮助
MySQL 在线文档:
官方 MySQL 文档是了解 MySQL 语法和功能的最佳资源,可以在 MySQL 的 官方文档 中找到。
MySQL 命令行帮助:
通过 MySQL 命令行工具,可以使用 HELP 命令来获取帮助
对于特定的 SQL 语句,可以使用 HELP <命令> 查看该命令的详细信息,例如 HELP CREATE DATABASE。
本地手册页(:
MySQL 命令的手册页也可以在 Unix/Linux 系统上通过 man 命令查看,例如 man mysql 或 man mysqladmin。
CREATE DATABASE testdb
CHARACTER SET utf8
COLLATE utf8_bin;
CREATE TABLE host (
id INT AUTO_INCREMENT PRIMARY KEY,
host VARCHAR(200) NOT NULL,
ip VARCHAR(16),
cname VARCHAR(200)
);
- 根据表扩展出几个语句,完成总结DDL, DML的用法,并配上示例。
| DDL | 数据定义语言(Data Definition Language) | CREATE, ALTER, DROP, RENAME, TRUNCATE |
| DML | 数据操作语言(Data Manipulation Language) | SELECT, INSERT, UPDATE, DELETE, REPLACE, LOAD DATA |
insertt
insert into host(host,ip,cname)values('ho','1.1.1.1','test1') #写入数据
select
select * from host #查看数据
drop
DROP TABLE host; #删表
TRUNCATE
TRUNCATE TABLE host; 清数据,保留表结构
UPDATE
UPDATE host
SET ip = '2.2.2.2'
WHERE id = 2; #更新表数据
ALTER
ALTER TABLE host
MODIFY COLUMN ip VARCHAR(20);#修改表结构
7. 总结mysql架构原理
mysql由connectors、sql interface、parser、optimizer、cache、管理工具、存储引擎等组成
connectors是连接器;可供Native C API、JDBC、ODBC、NET、PHP、Perl、Python、Ruby、Cobol等连接mysql
#mysql是单进程多线程,所以会存在一个线程池,而每个连接又分长短,长是接入直到使用quit命令退出,而短就是mysql -e命令的使用。
sql interface是解释器;对用户的sql命令进行解释,识别命令、选项、参数,是否存在学法错误。
parser是专门的分析器;对语句进行解释后通过parser去执行,就像编译器将代码转化成二进制,去完成命令。
optimizer类似路由选择,当我们分析完成后会生成多个执行树,所有存在多条路径去完成命令,而通过optimizer去优化路径
存储引擎,mysql是插件式存储引擎,它就能够替换使用选择多种不同的引擎。现在的mariadb多为innodb引擎。
管理工具,mysql自带备份等等工具。
8. 总结myisam和Innodb存储引擎的区别。
特性/功能 | MyISAM | InnoDB |
---|---|---|
Storage Limits(存储限制) | 受文件系统限制(单表最大 256TB,依赖文件系统)。 | 默认情况下,单表最大 64TB,扩展表空间可以更大。 |
Transactions(事务) | 不支持事务。 | 完全支持 ACID 事务(Atomicity, Consistency, Isolation, Durability)。 |
Locking Granularity(锁定粒度) | 表级锁(Table-level locking)。 | 行级锁(Row-level locking),减少锁争用。 |
MVCC(多版本并发控制) | 不支持 MVCC。 | 支持 MVCC,减少读写锁冲突。 |
Geospatial Data Type Support(地理空间数据类型支持) | 支持,但不如 InnoDB 完善。 | 完全支持(如 POINT 、LINESTRING 、POLYGON 等)。 |
Geospatial Indexing Support(地理空间索引支持) | 支持空间索引(SPATIAL)。 | 完全支持空间索引(SPATIAL)。 |
B-Tree Indexes(B树索引) | 支持。 | 支持。 |
T-Tree Indexes(T树索引) | 不支持。 | 不支持。 |
Hash Indexes(哈希索引) | 不支持。 | 支持(仅在内存临时表中和某些情况下的辅助索引使用)。 |
Full-Text Search Indexes(全文搜索索引) | 支持,适合全文检索。 | 支持(从 MySQL 5.6 开始),但性能通常不如 MyISAM。 |
Clustered Indexes(聚簇索引) | 不支持。 | 支持,表的数据存储按主键聚簇在一起。 |
Data Caches(数据缓存) | 不直接支持,仅依赖操作系统缓存。 | 支持 InnoDB 缓冲池(Buffer Pool)缓存数据和索引。 |
Index Caches(索引缓存) | 支持 Key Cache,用于缓存索引。 | 支持 InnoDB 缓冲池缓存索引。 |
Compressed Data(数据压缩) | 支持压缩表(.MYI 和 .MYD 文件)。 | 支持表和页面级别的数据压缩(从 MySQL 5.7 开始)。 |
Encrypted Data(数据加密) | 不支持本地加密。 | 支持透明数据加密(Transparent Data Encryption,TDE)。 |
Cluster Database Support(集群数据库支持) | 不支持本地集群解决方案,依赖于第三方工具。 | 支持 InnoDB Cluster,适合高可用和高扩展性。 |
Replication Support(复制支持) | 支持 MySQL 复制(Replication)。 | 支持 MySQL 复制和 Group Replication,适合高可用性应用。 |
Foreign Key Support(外键支持) | 不支持外键约束。 | 支持外键约束,确保数据一致性和完整性。 |
Backup/Point-in-Time Recovery(备份/时间点恢复) | 需要停止写入以进行备份,支持基本的备份恢复。 | 支持热备份和时间点恢复(PITR),适合持续性操作。 |
Query Cache Support(查询缓存支持) | 支持查询缓存。 | 支持查询缓存(MySQL 8.0 开始移除),但 InnoDB 的缓冲池更重要。 |
Update Statistics for Data Dictionary(数据字典的更新统计) | 手动更新统计信息。 | 自动和手动更新统计信息,适应性强。 |
9. 总结mysql索引作用,同时总结哪些查询不会使用到索引。
索引的主要作用是加速数据检索,使得查询操作更高效。例如,当在一个大型表上进行搜索时,没有索引的情况下,MySQL 需要扫描表中的每一行数据,这称为全表扫描 (Full Table Scan)。而有了索引后,MySQL 可以直接通过索引定位到数据行,大大减少扫描的数据量。
- 未索引的列:
如果查询条件中使用了未被索引的列,MySQL 将无法利用索引来加速查询。这种情况下,MySQL 会执行全表扫描。 - 使用了函数或表达式:
当查询条件中的列被函数或表达式包裹时,MySQL 通常无法使用索引,因为索引只对原始列值有效。 - 前导模糊匹配:
在 LIKE 查询中,如果使用了前导通配符 (%) 进行匹配,索引将失效。 - 不等操作符:
对于某些情况的 != 或 <> 操作符,MySQL 可能无法有效使用索引。 - 全表扫描操作:
对于某些 SQL 操作符,MySQL 可能会选择进行全表扫描,即使索引存在例如,对于 IS NULL 或 IS NOT NULL 的查询。例如,对于 IS NULL 或 IS NOT NULL 的查询 - OR 条件:
在使用 OR 连接的查询条件中,如果其中一个条件没有索引,MySQL 可能会放弃使用索引进行优化。 - 高选择性低的字段:
索引在高选择性(即唯一值多,重复值少)的字段上效率最高。如果一个字段的选择性很低(例如,性别字段通常只有两个值),索引的使用效率会很低,MySQL 可能会选择全表扫描。 - 数据类型不匹配:
如果查询条件中的数据类型与索引列的数据类型不匹配,MySQL 可能无法利用索引。 - 索引失效:
在某些情况下,索引可能失效,例如组合索引的非第一个字段、查询的列是动态生成的等。 - LIMIT 偏移量较大:
在使用 LIMIT 和大偏移量时,索引可能不会完全被利用。 - 小表:
数据太少,索引甚至没有全表搜索快
10. 总结事务ACID事务特性
ACID
A:原子性;整个事务所有操作要么全部成功,要么全部失败回滚
C:一致性;数据库从一个一致性转换成另一个一致性
I:隔离性;一个事务所作操作提交前,不能被其他事务所见,隔离又级别区分
D:持久性;一旦事务提交,所做修改永久保存
11. 总结事务日志工作原理。
redo log:记录某数据块被修改后的值,数据更新前先记录redo log( WALWrite Ahead Log ),可以
用来恢复未写入data file的已成功事务更新的数据
undo log:保存与执行的操作相反的操作,即记录某数据被修改前的值,可以用来在事务失败时进行rollback
事务进行数据修改时写入内存,后写入redo.log,并记录相反操作用作roback写入udoo.log,数据在提交后,则写入数据库。
12. 总结mysql日志类型,并说明如何启动日志。
MySQL 中主要有以下几种类型的事务日志:
事务日志
使用事务时,记录操作,失败时rollback
#它们是MySQL事务处理和数据恢复机制的核心部分,由MySQL自动管理。当使用事务时自动启用
错误日志
mysqld启动和关闭过程中输出的事件信息
mysqld运行中产生的错误信息
event scheduler运行一个event时产生的日志信息
在主从复制架构中的从服务器上启动从服务器线程时产生的信息
#可调整哪些警告信息记录,自动启动
例子:
log_warnings=0|1|2|3... #MySQL5.7之前
log_error_verbosity=0|1|2|3... #MySQL8.0
通用日志
通用日志:记录对数据库的通用操作,包括:错误的SQL语句
通用日志可以保存在:file(默认值)或 table(mysql.general_log表)
配置方法:
在 my.cnf 文件中,设置 general_log 为 ON,并指定 general_log_file。
#需要手动启动,因为会产生大量数据,所以不建议在生产环境下使用
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/mysql.log
慢查询日志
记录执行时间超过 long_query_time 秒数的所有 SQL 语句,帮助识别性能瓶颈。
#需要手动启动
配置方法:
在 my.cnf 文件中,启用慢查询日志并指定 slow_query_log_file,设置 long_query_time 以定义查询时间阈值。
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 单位为秒
二进制日志(备份)
记录所有更改数据的 SQL 语句(例如 INSERT、UPDATE、DELETE),用于数据恢复和主从复制。
配置方法:
在 my.cnf 文件中,启用二进制日志并指定 log_bin 文件前缀。
[mysqld]
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW # 或者是 STATEMENT 或 MIXED
启动方法:
MySQL 服务启动时,自动启用二进制日志(如果在配置文件中启用了 log_bin)。
13. 总结二进制日志的不同格式的使用场景。
配置
[mysqld]
binlog_format = STATEMENT|ROW|MIXED
-
基于语句的日志 (Statement-based Logging, SBL)
描述:
记录执行的每一个 SQL 语句。
是 MySQL 早期版本中默认的二进制日志格式。
使用场景:
低写操作开销:因为只记录语句,日志量通常较小,适用于写操作频繁的场景。
数据一致性要求较低:对于一些对数据一致性要求不高的场景,SBL 可以简化日志管理。
简单的 SQL 语句:对于简单的 SQL 操作(不涉及非确定性函数、复杂的业务逻辑),SBL 能很好地工作。
审计和调试:SBL 可以清楚地显示执行了哪些 SQL 语句,有助于审计和调试。
优点:
生成的日志文件较小,节省存储空间。
适合简单的事务,易于理解和审计。
缺点:
对于复杂查询或使用非确定性函数(如 NOW() 或 RAND())的场景,可能导致主从数据不一致。
不支持某些特定的操作,如 AUTO_INCREMENT 的并发插入 -
基于行的日志 (Row-based Logging, RBL)
描述:
记录每一行数据的变化,而不是执行的 SQL 语句。
MySQL 5.1 及以后版本推荐的二进制日志格式。
使用场景:
高数据一致性要求:在主从复制中,确保主从服务器数据一致性的场景。
复杂 SQL 操作:包括非确定性函数、触发器和存储过程,RBL 能精确复制这些操作。
大量数据操作:适用于批量插入或更新操作,这种情况下,RBL 更加高效。
跨数据库复制:支持不同 MySQL 版本之间的复制。
优点:
保证数据复制的一致性,无论 SQL 语句多么复杂。
对于行级别的更改,能精确反映每一行的变化。
缺点:
日志文件可能非常大,尤其是涉及大量行操作时。
不适合频繁进行全表扫描或大批量数据操作的场景。 -
混合日志 (Mixed Logging, MBL)
描述:
结合了基于语句和基于行的日志记录方式,根据具体情况选择合适的方式记录。
默认情况下,使用语句模式。当检测到某些语句无法安全使用语句模式时,切换到行模式。
使用场景:
通用场景:适用于大多数场景,能够自动在语句和行模式之间切换,提供了更好的灵活性。
复杂应用场景:应用程序中包含各种 SQL 操作,且需要在语句和行模式之间平衡时,MBL 是一个不错的选择。
性能和一致性的平衡:需要在性能(较小的日志)和一致性(精确的数据复制)之间取得平衡。
优点:
提供了两种日志格式的优点,自动在最适合的模式之间切换。
更好地支持复杂和多样的应用场景。
缺点:
实现较为复杂,日志文件大小和性能可能介于 SBL 和 RBL 之间。
对于某些特定应用场景,不如专用的 SBL 或 RBL 高效。
14. 总结mysql备份类型,并基于mysqldump, xtrabackup完成数据库备份与恢复验证。
完全备份,部分备份
完全备份:整个数据集
部分备份:只备份数据子集,如部分库或表
完全备份、增量备份、差异备份
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较
快,还原复杂
差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
冷、温、热备份
冷备:读、写操作均不可进行,数据库停止服务
温备:读操作可执行;但写操作不可执行
热备:读、写操作均可执行
MyISAM:温备,不支持热备
InnoDB:都支持
物理和逻辑备份
物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
逻辑备份:从数据库中"导出"数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度
mysqldump
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databses;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'databses' at line 1
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
exit
[root@192 backup]# mysqldump -u root -B -p testdb > testdb_backup.sql
Enter password:
[root@192 backup]# ll
total 8
drwxr-xr-x 5 root root 4096 Jun 9 16:26 base
-rw-r--r-- 1 root root 2218 Jun 11 01:35 testdb_backup.sql
mysql> drop database testdb;
Query OK, 1 row affected (0.04 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
[root@192 backup]# mysql -u root -p < testdb_backup.sql
Enter password:
[root@192 backup]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
xtrabackup
xtrabackup -uroot -pmagedu --backup --target-dir=/backup/base
[root@192 backup]# ll
total 4
drwxr-xr-x 6 root root 4096 Jun 11 02:33 base
[root@192 backup]# systemctl status mysqld
● mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor pre>
Active: inactive (dead)
[root@192 backup]# rm -rf /var/lib/mysql
[root@192 backup]# ll /var/lib/mysql
ls: cannot access '/var/lib/mysql': No such file or directory
[root@192 backup]# mkdir -p /var/lib/mysql
[root@192 backup]# ll /var/lib/mysql
total 0
xtrabackup --prepare --target-dir=/backup/base
xtrabackup --copy-back --target-dir=/backup/base
chown -R mysql:mysql /var/lib/mysql
[root@192 backup]# systemctl start mysqld
[root@192 backup]# systemctl status mysqld
● mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor pre>
Active: active (running) since Tue 2024-06-11 02:44:51 CST; 3s ago
Process: 18632 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, s>
Process: 18551 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service >
Process: 18526 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, sta>
Main PID: 18587 (mysqld)
Status: "Server is operational"
Tasks: 37 (limit: 11653)
Memory: 410.3M
CGroup: /system.slice/mysqld.service
└─18587 /usr/libexec/mysqld --basedir=/usr
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
5 rows in set (0.00 sec)
- 编写crontab,每天按表备份所有mysql数据。将备份数据放在以天为时间的目录下。基于xtrabackup,每周1,周5进行完全备份,周2到周4进行增量备份
0 12 * * * /backup/mysql_dump_backup.sh
0 12 * * * /backup/mysql_xar_backup.sh
使用 mysqldump 进行每日备份
mysql_dump_backup.sh
# 备份路径
BACKUP_DIR=/backup/daily/$DATE
# MySQL 相关信息
#MYSQL_USER="root"
#MYSQL_PASSWORD="root"
# 创建备份目录
#mkdir -p $BACKUP_DIR
# 获取所有数据库列表
databases=$(mysql -e "SHOW DATABASES;" | mysql -e "show databases;"|grep -v Database | grep -v "+")
# 遍历每个数据库
for db in $databases; do
# 创建数据库目录
mkdir -p $BACKUP_DIR/$db
# 获取该数据库的所有表
tables=$(mysql -e "show tables in $db;"| grep -Ev "(Tables_in_$db)")
echo $tables
# 遍历每个表
for table in $tables; do
# 导出每个表
mysqldump $db $table > $BACKUP_DIR/$db/$table.sql
done
done
基于xtrabackup,每周1,周5进行完全备份,周2到周4进行增量备份
mysql_xar_backup.sh
#!/bin/bash
#需要先从周一开始执行
# 设置日期变量
DAY=$(date +\%u) # 获取星期几
WEEK=$(date '+\%V') # 获取当前周数
# 备份路径
FULL_BACKUP_DIR=/backup/base/weekly/FULL/week$WEEK
IN_BACKUP_DIR=/backup/base/weekly/IN/week$WEEK
BASE_DIR=$FULL_BACKUP_DIR
TARGET_DIR="" # 初始化目标目录
# MySQL 数据目录
MYSQL_DATA_DIR=/var/lib/mysql/
# MySQL 相关信息
#MYSQL_USER="root"
#MYSQL_PASSWORD="root"
if [ "$DAY" -eq 1 ] || [ "$DAY" -eq 5 ]; then
TARGET_DIR="$FULL_BACKUP_DIR/$(date +\%Y-\%m-\%d)"
if [ ! -d "$TARGET_DIR" ]; then
mkdir -p "$TARGET_DIR"
fi
xtrabackup --backup --datadir=$MYSQL_DATA_DIR --target-dir=$TARGET_DIR
else
LAST_INC_BACKUP=$(ls -td $IN_BACKUP_DIR/* | head -1)
#找到最新的增量备份目录,用于作为当前增量备份的基准目录
TARGET_DIR="$IN_BACKUP_DIR/$(date +\%Y-\%m-\%d)"
if [ ! -d "$TARGET_DIR" ]; then
mkdir -p "$TARGET_DIR"
fi
BASE_DIR="$FULL_BACKUP_DIR/$(ls -t $FULL_BACKUP_DIR | head -1)"
if [ -n "$LAST_INC_BACKUP" ]; then
BASE_DIR="$LAST_INC_BACKUP"
if [`echo $BASE_DIR| cut -d '-' -f4` -lt $week]
BASE_DIR="$TARGET_DIR"
fi
fi
xtrabackup --backup --datadir="$MYSQL_DATA_DIR" --target-dir="$TARGET_DIR" --incremental-basedir="$BASE_DIR"
fi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!