零基础从头教学Linux(Day 60)

MySQL数据库基础

七、数据库操作命令

库操作命令

  • 查看数据库
bash 复制代码
show databases;
  • 查看所在数据库
bash 复制代码
select database();
  • 查看当前登录用户
bash 复制代码
select user();
  • 查看当前数据库版本
bash 复制代码
select version();
  • 查看用户权限列表
bash 复制代码
show privileges[\G];
  • 查看指定用户的权限
bash 复制代码
show grants for root@localhost\G;
  • 切换数据库
bash 复制代码
use databaseName[;]
  • 创建数据库
bash 复制代码
create database databaseName  [character set utf8];
  • 删除数据库
bash 复制代码
drop database databaseName;
  • 查看支持的字符集
bash 复制代码
SHOW CHARACTER SET;

表结构操作命令

  • 查看数据表
bash 复制代码
show tables;
  • 查看表结构
bash 复制代码
desc[describe] tableName;
[root@mysqld ~]# mysql -e "desc mysql.user"
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                    | Type                              | Null | Key | Default               | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                     | char(255)                         | NO   | PRI |                       |       |
| User                     | char(32)                          | NO   | PRI |                       |       |
| Select_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv                | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv                | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv      | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv               | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv   | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type                 | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher               | blob                              | NO   |     | NULL                  |       |
| x509_issuer              | blob                              | NO   |     | NULL                  |       |
| x509_subject             | blob                              | NO   |     | NULL                  |       |
| max_questions            | int unsigned                      | NO   |     | 0                     |       |
| max_updates              | int unsigned                      | NO   |     | 0                     |       |
| max_connections          | int unsigned                      | NO   |     | 0                     |       |
| max_user_connections     | int unsigned                      | NO   |     | 0                     |       |
| plugin                   | char(64)                          | NO   |     | caching_sha2_password |       |
| authentication_string    | text                              | YES  |     | NULL                  |       |
| password_expired         | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed    | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime        | smallint unsigned                 | YES  |     | NULL                  |       |
| account_locked           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_role_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_role_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Password_reuse_history   | smallint unsigned                 | YES  |     | NULL                  |       |
| Password_reuse_time      | smallint unsigned                 | YES  |     | NULL                  |       |
| Password_require_current | enum('N','Y')                     | YES  |     | NULL                  |       |
| User_attributes          | json                              | YES  |     | NULL                  |       |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
​
  • 创建数据表
bash 复制代码
create table tableName(columnName(列名称) dataType(数据类型), ............);
  • 删除数据表
bash 复制代码
drop table tableName;
alter命令用法

语法

bash 复制代码
ALTER TABLE <表名> [修改选项]

常见用法

bash 复制代码
| ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名>
| CHARACTER SET <字符集名>
| COLLATE <校对规则名> 
​

案例

  • 创建测试表
bash 复制代码
create table stu_score(id tinyint, name varchar(50), score decimal(4,2), object varchar(50));
  • 修改表名
bash 复制代码
#alter table tab_name rename to tab_new;
#修改表名
alter table stu_score rename to stuS;
  • 修改字段类型(修改字段相对位置)
bash 复制代码
#alter table tab_name modify field type (first/before/after field1);
alter table stuS modify id int;
  • 修改字段默认值/是否为空/自动增长
bash 复制代码
#alter table tab_name modify field type not null/default ="未知"/auto_increment;
#自动增长
alter table stuS modify id int primary key;
alter table stuS modify id int auto_increment;
  • 修改字段名/字段类型
bash 复制代码
#alter table tab_name change field  newfield newtype;
#修改字段类型
alter table stuS modify id int;
#修改字段名及类型
alter table stuS change column object subject varchar(50);
#通过alter modify 修改字段是否为null或者默认值!
alter table  stuS modify column name varchar(50) not null default "未知";
  • 添加字段
bash 复制代码
#alter table tab_name add field type (first/before/after field1);
alter table stuS add column extra text;
#添加到第一列
alter table stuS add i int first; 
#添加到某一字段后面!
alter table stuS add sex varchar(10) after name; 
  • 删除字段
bash 复制代码
#alter table tab_name drop field;
alter table stuS drop id;

表数据操作

插入数据
  • 单行插入
bash 复制代码
insert [into]  tableName[(columnName,.........)] value('value1',value2,.......);
  • 批量插入
bash 复制代码
insert into stu value('张三', 22, '11011011011', '男'),('王无',26 , '12011011011', '女'),('里斯',27 ,'12011011099', '男');

注意:只书写表名称,表示全表插入,即,全字段插入! 插入的数据数量与字段数量一定要相等!

where字句运算符

比较运算符

运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 不等于
BETWEEN a0 AND a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...) 如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 是 NULL
IS NOT NULL 不是 NULL
LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

逻辑运算符

运算符 说明
AND (&&) 多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR (||) 任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT (!) 条件为 TRUE(1),结果为 FALSE(0)

正则表达式

MySQL 提供了几种使用正则表达式的方式,主要通过 REGEXPRLIKE 操作符实现(两者功能相同)。

基本正则表达式操作

1. 正则匹配
bash 复制代码
SELECT * FROM users WHERE username REGEXP '^[a-z]';
-- 选择用户名以小写字母开头的记录
2. 正则不匹配
bash 复制代码
SELECT * FROM users WHERE username NOT REGEXP '^[0-9]';
-- 选择用户名不以数字开头的记录

在 CHECK 约束中使用正则表达式

MySQL 8.0+ 支持 CHECK 约束中的正则表达式:

bash 复制代码
ALTER TABLE users 
ADD CONSTRAINT chk_username_format 
CHECK (username REGEXP '^[a-zA-Z][a-zA-Z0-9_]{2,}$');

常用正则表达式模式

模式 含义
^ 字符串开头
$ 字符串结尾
. 任意单个字符
[abc] a、b 或 c
[^abc] 非 a、b 或 c
a* 零个或多个 a
a+ 一个或多个 a
a{2} 正好两个 a
a{2,} 两个或更多 a
a{2,4} 2到4个 a

正则表达式函数

MySQL 还提供了一些正则表达式相关函数:

bash 复制代码
-- 替换匹配的部分
SELECT REGEXP_REPLACE('abc123', '[0-9]', 'X'); -- 返回 'abcXXX'
​
-- 提取匹配的子串
SELECT REGEXP_SUBSTR('abc123', '[0-9]+'); -- 返回 '123'
​
-- 检查是否匹配
SELECT REGEXP_LIKE('abc123', '[0-9]'); -- 返回 1 (true)

注意事项

  1. MySQL 默认使用不区分大小写的匹配,除非使用二进制字符串或指定区分大小写的排序规则

  2. 正则表达式语法在不同数据库系统中可能有差异

  3. 对于复杂的正则表达式,可能会影响查询性能

MySQL 使用的是基于 Henry Spencer 实现的正则表达式库,与 POSIX 标准兼容。

更新数据
  • 全表更新
bash 复制代码
update tableName set  columnName=newValue;
  • 条件更新
bash 复制代码
update tableName set  columnName=newValue where columnName=currentValue;
update stuS set sex='女' where name='铁蛋' and subject='中国武术';
删除数据
  • 全表删除
bash 复制代码
delete from tableName;
  • 条件删除
bash 复制代码
delete from tableName where columnName=currentValue;
delete from stuS where id=6;
查询数据

生成测试表

bash 复制代码
#表结构
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(50)  | YES  |     | NULL    |       |
| class | int(11)      | YES  |     | NULL    |       |
| score | decimal(5,2) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
​
mysql -p123 -e "create database if not exists jx2412; create table if not exists jx2412.sc(name varchar(50),class int,score int)"
for i in `cat 2409.txt` ;do echo "insert into jx2409.sc value('$i',$[$RANDOM % 7 + 1],$[$RANDOM % 100]);" > sc.sql;done
create database jx2409;
use jx2409;
create table sc(name varchar(50), class int, score decimal(5,2));
mysql jx2409 < sc.sql
  • 全表查询
bash 复制代码
select * from tableName;
  • 去重查询
bash 复制代码
#distinct
​
select  distinct class from stu;
+-------+
| class |
+-------+
|     2 |
|     7 |
|     1 |
|     5 |
|     4 |
|     6 |
|     3 |
+-------+
  • 统计查询,非空数据
bash 复制代码
#count()
​
select count(distinct class) from stu;
+-----------------------+
| count(distinct class) |
+-----------------------+
|                     7 |
+-----------------------+
​
  • 重新定义查询结果表中的列名称
bash 复制代码
#as
​
select count(*) [as] count from stu;
#改变结果表中的字段名称
select name  姓名, class  班级, score  成绩 from sc;
+-----------+--------+--------+
| 姓名      | 班级   | 成绩   |
+-----------+--------+--------+
| 魏嘉辰    |      2 |  98.00 |
| 陶沛宏    |      7 |  64.00 |
​
  • 聚合函数查询
bash 复制代码
#sum():计算和值
select sum(score) 总成绩 from sc;
+-----------+
| 总成绩    |
+-----------+
|   1422.00 |
+-----------+
​
#avg():计算平均值
mysqld [jx2409]> select avg(score) 平均成绩 from sc;
+--------------+
| 平均成绩     |
+--------------+
|    50.785714 |
+--------------+
​
#max():最大值
mysqld [jx2409]> select max(score) 最高成绩 from sc;
+--------------+
| 最高成绩     |
+--------------+
|        99.00 |
​
#min():最小值
select min(score) 最低成绩 from sc;
+--------------+
| 最低成绩     |
+--------------+
|         0.00 |
+--------------+
​
  • 分组查询
bash 复制代码
#group by
##每个班的总成绩
select class,sum(score) from sc group by class;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     1 |     151.00 |
|     2 |     201.00 |
|     3 |     261.00 |
|     4 |     199.00 |
|     5 |     174.00 |
|     6 |     149.00 |
|     7 |     287.00 |
+-------+------------+
##排除2班的每个班的总成绩
select class,sum(score) from sc where class!=2 group by class;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     1 |     151.00 |
|     3 |     261.00 |
|     4 |     199.00 |
|     5 |     174.00 |
|     6 |     149.00 |
|     7 |     287.00 |
+-------+------------+
​
​
#分组后的条件:having
​
##查询总成绩大于200分的班级
select class,sum(score) from sc where class!=2 group by class having sum(score) > 200.00;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     3 |     261.00 |
|     7 |     287.00 |
+-------+------------+
  • 排序查询
bash 复制代码
#order by
#升序
#select * from stu order by age [asc];
#查询总成绩的升序排列结果
select class,sum(score) from sc group by class order by sum(score);
+-------+------------+
| class | sum(score) |
+-------+------------+
|     6 |     149.00 |
|     1 |     151.00 |
|     5 |     174.00 |
|     4 |     199.00 |
|     2 |     201.00 |
|     3 |     261.00 |
|     7 |     287.00 |
+-------+------------+
#降序
#select * from stu order by age desc;
#查询总成绩的降序排列结果
select class,sum(score) from sc group by class order by sum(score) desc;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     7 |     287.00 |
|     3 |     261.00 |
|     2 |     201.00 |
|     4 |     199.00 |
|     5 |     174.00 |
|     1 |     151.00 |
|     6 |     149.00 |
+-------+------------+
  • 分页查询
bash 复制代码
#limit  number
​
#显示前number行
​
#select * from stu limit 2;
##查询总成绩第一名
select class,sum(score) from sc group by class order by sum(score) desc limit 1;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     7 |     287.00 |
+-------+------------+
​
​
#limit [startNumber,显示的数据行数]
​
#select * from stu limit 2,1;
#只查看总成绩的第二名
select class,sum(score) from sc group by class order by sum(score) desc limit 1,1;
+-------+------------+
| class | sum(score) |
+-------+------------+
|     3 |     261.00 |
+-------+------------+
​
  • 子查询
bash 复制代码
#select name,score from stu where name in (select name from info);
​
select name,score from sc where name in (select name from class2);
+-----------+-------+
| name      | score |
+-----------+-------+
| 魏嘉辰    | 98.00 |
| 丁睿      | 89.00 |
| 张毅      | 14.00 |
+-----------+-------+
​
  • union联合查询
bash 复制代码
####字段个数必须相同
mysql> select * from sc  union select 1,2,3;
+-----------+-------+-------+
| name      | class | score |
+-----------+-------+-------+
| 俞亮      |     1 | 70.00 |
| 刘博实    |     4 | 54.00 |
| 刘振尧    |     6 | 73.00 |
| 张霖杰    |     6 | 16.00 |
| 陈金招    |     5 | 31.00 |
| 武光斌    |     3 | 99.00 |
| 张浩      |     1 | 70.00 |
| 李松旺    |     3 | 43.00 |
| 潘圳航    |     5 | 28.00 |
| 米博宇    |     7 | 88.00 |
| 李振辉    |     4 |  0.00 |
| 王晨宇    |     5 | 57.00 |
| 谢辉      |     2 | 84.00 |
| 1         |     2 |  3.00 |
+-----------+-------+-------+
14 rows in set (0.01 sec)
​
​
###
mysql> select * from sc  union select '铁锤',2,45;
+-----------+-------+-------+
| name      | class | score |
+-----------+-------+-------+
| 俞亮      |     1 | 70.00 |
| 刘博实    |     4 | 54.00 |
| 刘振尧    |     6 | 73.00 |
| 张霖杰    |     6 | 16.00 |
| 陈金招    |     5 | 31.00 |
| 武光斌    |     3 | 99.00 |
| 张浩      |     1 | 70.00 |
| 李松旺    |     3 | 43.00 |
| 潘圳航    |     5 | 28.00 |
| 米博宇    |     7 | 88.00 |
| 李振辉    |     4 |  0.00 |
| 王晨宇    |     5 | 57.00 |
| 谢辉      |     2 | 84.00 |
| 铁锤      |     2 | 45.00 |
+-----------+-------+-------+
14 rows in set (0.00 sec)
​
###
select * from sc union (select name,2,3 from info limit 1);
  • 多表查询

内连接查询

bash 复制代码
#select A.name as name, A.school, B.job from B,A where A.name=B.name;
​
#select A.name as name, A.school, B.job from B [inner] join A on A.name=B.name;
​
select class2.id, class2.name, sc.class, sc.score from sc  join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id   | name      | class | score |
+------+-----------+-------+-------+
|    1 | 魏嘉辰    |     2 | 98.00 |
|    2 | 丁睿      |     2 | 89.00 |
|    3 | 张毅      |     2 | 14.00 |
+------+-----------+-------+-------+
​

外连接查询

  • 左外连接
bash 复制代码
#select A.name as nameA, A.school, B.name as nameB, B.job from B  left join  A on A.name=B.name;
select class2.id, class2.name, sc.class, sc.score from sc left join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id   | name      | class | score |
+------+-----------+-------+-------+
|    1 | 魏嘉辰    |     2 | 98.00 |
|    2 | 丁睿      |     2 | 89.00 |
|    3 | 张毅      |     2 | 14.00 |
| NULL | NULL      |     7 | 64.00 |
| NULL | NULL      |     1 | 52.00 |
| NULL | NULL      |     7 | 99.00 |
| NULL | NULL      |     7 | 28.00 |
| NULL | NULL      |     5 | 91.00 |
| NULL | NULL      |     1 | 38.00 |
| NULL | NULL      |     4 | 29.00 |
| NULL | NULL      |     6 |  1.00 |
| NULL | NULL      |     3 | 74.00 |
| NULL | NULL      |     6 |  0.00 |
| NULL | NULL      |     3 | 25.00 |
| NULL | NULL      |     6 | 84.00 |
| NULL | NULL      |     1 |  1.00 |
| NULL | NULL      |     1 | 53.00 |
| NULL | NULL      |     4 | 84.00 |
| NULL | NULL      |     3 | 79.00 |
| NULL | NULL      |     3 | 30.00 |
| NULL | NULL      |     7 | 96.00 |
| NULL | NULL      |     6 | 64.00 |
| NULL | NULL      |     3 | 12.00 |
| NULL | NULL      |     5 | 78.00 |
| NULL | NULL      |     1 |  7.00 |
| NULL | NULL      |     5 |  5.00 |
| NULL | NULL      |     4 | 86.00 |
| NULL | NULL      |     3 | 41.00 |
+------+-----------+-------+-------+
​
  • 右外连接
bash 复制代码
#select A.name as nameA, A.school, B.name as nameB, B.job from B  right join  A on A.name=B.name;
select class2.id, class2.name, sc.class, sc.score from sc right join class2 on sc.name=class2.name;
+------+-----------+-------+-------+
| id   | name      | class | score |
+------+-----------+-------+-------+
|    1 | 魏嘉辰    |     2 | 98.00 |
|    2 | 丁睿      |     2 | 89.00 |
|    3 | 张毅      |     2 | 14.00 |
|    4 | Rose      |  NULL |  NULL |
+------+-----------+-------+-------+

八、mysql用户权限管理

MySQL数据库权限分类

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 Databases To use CREATE FUNCTION/PROCEDURE
Create temporary tables Databases To use CREATE TEMPORARY TABLE
Create view Tables To create new views
Create user Server Admin To create new users
Delete Tables To delete existing rows
Drop Databases,Tables To drop databases, tables, and views
Event Server Admin To create, alter, drop and execute events
Execute Functions,Procedures To execute stored routines
File File access on server To read and write files on the server
Grant option Databases,Tables,Functions,Procedures To give to other users those privileges you possess
Index Tables To create or drop indexes
Insert Tables To insert data into tables
Lock tables Databases To use LOCK TABLES (together with SELECT privilege)
Process Server Admin To view the plain text of currently executing queries
Proxy Server Admin To make proxy user possible
References Databases,Tables To have references on tables
Reload Server Admin To reload or refresh tables, logs and privileges
Replication client Server Admin To ask where the slave or master servers are
Replication slave Server Admin To read binary log events from the master
Select Tables To retrieve rows from table
Show databases Server Admin To see all databases with SHOW DATABASES
Show view Tables To see views with SHOW CREATE VIEW
Shutdown Server Admin To shut down the server
Super Server Admin To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.
Trigger Tables To use triggers
Create tablespace Server Admin To create/alter/drop tablespaces
Update Tables To update existing rows
Usage Server Admin No privileges - allow connect only

中文释义

复制代码
在MySQL中,权限控制是通过Grant和Revoke命令来管理用户和角色的权限的。
- Alter:修改。允许用户修改数据库中的表结构。
- Alter routine:修改存储过程或函数。允许用户修改已创建的存储过程或函数。
- Create:创建。允许用户创建新的数据库对象,如表、视图、存储过程等。
- Create routine:创建存储过程或函数。允许用户创建新的存储过程或函数。
- Create temporary tables:创建临时表。允许用户创建临时表,这些表在会话结束时会自动删除。
- Create view:创建视图。允许用户创建新的视图。
- Create user:创建用户。允许用户创建新的数据库用户账户。
- Delete:删除。允许用户删除表中的数据。
- Drop:删除。允许用户删除数据库中的对象,如表、视图等。
- Event:事件。允许用户管理和修改事件调度器中的事件。
- Execute:执行。允许用户执行存储过程或函数。
- File:文件。允许用户访问数据库服务器的文件系统。
- Grant option:授予选项。允许用户将权限授予其他用户。
- Index:索引。允许用户在表上创建、修改或删除索引。
- Insert:插入。允许用户向表中插入数据。
- Lock tables:锁定表。允许用户锁定数据库中的表,以防止其他用户同时访问这些表。
- Process:进程。允许查看或杀死数据库服务器上的进程。
- Proxy:代理。允许用户作为代理登录,代表其他用户执行操作。
- References:引用。允许用户创建外键约束。
- Reload:重新加载。允许用户重新加载配置文件或刷新权限表。
- Replication client:复制客户端。允许用户从主服务器接收数据以进行复制。
- Replication slave:复制从机。允许用户作为数据复制的从服务器。
- Select:选择。允许用户查询表中的数据。
- Show databases:显示数据库。允许用户查看用的数据库列表。
- Show view:显示视图。允许用户查看数据库中的视图定义。
- Shutdown:关闭。允许用户关闭数据库服务器。
- Super:超级。允许用户所有的权限,并且可以不受限制地执行许多系统命令。
- Trigger:触发器。允许用户创建触发器,以在特定事件发生时自动执行代码。
- Create tablespace:创建表空间。允许用户创建新的表空间,用于存储数据库对象。
- Update:更新。允许用户更新表中的数据。
- Usage:使用。这个权限通常用于限制用户只能查看自己的权限,不能进行任何实际的数据库操作。
user_name host_name 说明
zhx 198.51.100.166 zhx,只能从此ip连接
zhx 198.51.100.% zhx,从192.168.115子网中的任何主机
zhx % zhx,任何主机可连

创建远程管理用户

bash 复制代码
create user webuser@'192.168.115.%' identified by '123.com';  -- 只创建的用户默认具有USAGE权限!
-- 更改密码
alter user jx@192.168.166.9 identified by '123';
-- 在mysql8之前的数据库,grant命令运行的时候,发现用户不存在,则隐式创建!
grant all on *.* to 'root'@'192.168.115.130';
flush privileges;

创建远程web服务数据库的操作用户

bash 复制代码
grant all on jx.* to 'webuser'@'192.168.115.%' identified by '123.com';
flush privileges;

查看用户权限

bash 复制代码
show grants for  'testuser'@'192.168.115.%';
mysqld [mysql]> show grants for webuser@'192.168.115.%';
+--------------------------------------------------------------------------------------------------------------------+
| Grants for webuser@192.168.115.%                                                                                   |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'192.168.115.%' IDENTIFIED BY PASSWORD '*AC241830FFDDC8943AB31CBD47D758E79F7953EA' |
+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
​

删除用户权限

bash 复制代码
revoke all on 库.表  from 'username'@'ipaddress';
flush privileges;

案例

bash 复制代码
-- 删除用户的连接权限
revoke usage on *.* from 'username'@'ipaddress';
-- 无法直接删除,只能删除账户
drop user sluser@localhost;

九、mysql数据库备份

9.1 数据备份的重要性

  • 备份的主要目的是灾难恢复。

  • 在生产环境中,数据的安全性至关重要。

  • 任何数据的丢失都可能产生严重的后果。

9.2 造成数据丢失的原因

  • 程序错误

  • 人为操作错误

  • 运算错误

  • 磁盘故障

  • 灾难(如火灾、地震)和盗窃

9.2 备份需要考虑的问题

  1. 可以容忍丢失多长时间的数据;

  2. 恢复数据要在多长时间内完成;

  3. 恢复的时候是否需要持续提供服务;

  4. 恢复的对象,是整个库,多个表,还是单个库,单个表。

9.4 备份类型

1、根据是否需要数据库离线
  • 冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;

  • 温备(warm backup):服务在线,但仅支持读请求,不允许写请求;

  • 热备(hot backup):备份的同时,业务不受影响。

注意:

这种类型的备份,取决于业务的需求,而不是备份工具

MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具

1.1、常用备份工具

商业工具

  • Navicat for MySQL

    • 功能特点:它提供了直观的图形化界面,方便用户轻松地创建备份任务、设置备份计划以及恢复数据。支持多种备份类型,如完整备份、增量备份等,还能对备份文件进行加密和压缩,以确保数据的安全性和减小备份文件的大小。

    • 适用场景:适用于各种规模的企业和开发团队,尤其是那些需要频繁进行数据库备份和恢复操作,且对操作的便捷性和可视化有较高要求的用户。

  • SQLyog Ultimate

    • 功能特点:具有强大的备份和恢复功能,支持定时备份,可以按照设定的时间周期自动执行备份任务。同时,它还提供了数据同步功能,能够在不同的 MySQL 数据库之间进行数据同步,方便数据迁移和数据一致性维护。

    • 适用场景:受 MySQL 开发者和数据库管理员的欢迎,常用于开发环境和生产环境中的数据库管理与备份工作,对于需要进行数据库版本控制和数据迁移的场景也非常实用。

开源工具

  • Percona XtraBackup

    • 功能特点:它是一款开源的热备份工具,能够在不停止 MySQL 服务的情况下进行备份,支持对 InnoDB 和 XtraDB 存储引擎的备份和恢复,备份过程中不会阻塞数据库的正常读写操作,从而保证了业务的连续性。此外,它还提供了增量备份和部分备份功能,可有效减少备份时间和备份文件的大小。

    • 适用场景:因其高效、灵活的特点,广泛应用于各种对业务连续性要求较高的生产环境,特别适合大型数据库和高并发应用场景下的备份需求 。

  • MyDumper

    • 功能特点:是一款多线程的备份和恢复工具,能够充分利用系统资源,大大提高备份和恢复的速度。它支持将数据库备份为多个文件,便于在恢复时进行灵活的选择和操作,同时还可以对备份文件进行压缩,节省存储空间。

    • 适用场景:适用于需要快速备份和恢复大型 MySQL 数据库的场景,如互联网公司的大规模数据存储和处理环境,以及对备份效率有较高要求的企业级应用。

2、根据要备份的数据集合的范围
  • 完全备份:full backup,备份全部字符集(全部数据库),每次备份都会进行完全备份,会导致备份文件占用大量的磁盘空间,并且有大量的重复数据,只适合第一次备份,不常用。

  • 差异备份: incremental backup,要先进行一次完全备份,每次差异备份都会备份上一次完全备份后的数据,可能会出现备份的重复数据,导致占用大量的磁盘空间;

  • 增量备份:differential backup,要先执行一次完全备份,每一次增量备份的数据都是备份在上一次完全备份或者上一次增量备份后的数据,不会出现重复数据,也不会占用额外的磁盘空间

建议的恢复策略
  • 完全+增量+二进制日志

  • 完全+差异+二进制日志

3、根据备份数据或文件

物理备份:直接备份数据文件

  • 优点:备份和恢复操作都比较简单,能够支持兼容的mysql版本;恢复速度快,属于文件系统级别的。

  • 建议:不要假设备份一定可用,要测试 mysql>check tables;检测表是否可用。

逻辑备份: 备份表中的数据和代码

  • 优点:恢复简单;备份的结果为ASCII文件,可以编辑;与存储引擎无关;可以通过网络备份和恢复;

  • 缺点:备份或恢复都需要mysql服务器进程参与;备份结果占据更多的空间;浮点数可能会丢失精度;还原之后,缩影需要重建

9.5 常见的备份方法

1、物理冷备(完全备份)

备份时数据库处于关闭状态,直接打包数据库文件

备份速度快,恢复时也是最简单的

2、专用备份工具mysqldump或mysqlhotcopy (完全备份,逻辑备份)

mysqldump常用的逻辑备份工具 (导出为sql脚本)

mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

启用二进制日志进行增量备份 (增量备份)

进行增量备份,需要刷新二进制日志

3、第三方工具备份

免费的MySQL热备份软件Percona XtraBackup(阿里云的工具:dts,支持热迁移)

9.6 备份案例

mysqldump工具

1、完整备份
所有数据库的备份

备份

bash 复制代码
mysqldump --all-databases -uroot > all.sql

恢复

bash 复制代码
mysql -uroot < all.sql
指定数据库的备份

备份

bash 复制代码
mysqldump --databases jx -uroot > jx.sql

恢复

bash 复制代码
mysql -uroot < jx.sql
指定数据表的备份

备份

bash 复制代码
mysqldump  jx stu > jx.stu.sql

恢复

bash 复制代码
mysql -uroot jx< jx.sql
2、增量备份

二进制备份

配置过程
bash 复制代码
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format="statement"
systemctl restart mysqld
查看日志文件内容
bash 复制代码
##在数据库中查看日志文件及书写位置
show master status;
######
mysqlbinlog mysql-bin.000001 |less
二进制备份的恢复
模拟数据丢失流程
bash 复制代码
flush logs; ###刷新日志文件,产生新的日志文件
​
-- 创建数据表及插入数据
​
flush logs;
​
-- 执行删除操作
数据恢复

基于位置

bash 复制代码
#基于开始位置
​
mysqlbinlog --start-position="245"  mysql-bin.000003 | mysql -uroot
​
#基于结束位置
​
mysqlbinlog --stop-position="632"  mysql-bin.000003 | mysql -uroot
​
#基于中间位置
​
mysqlbinlog --start-position="245" --stop-position="632"  mysql-bin.000003 | mysql -uroot

基于时间

bash 复制代码
#基于开始时间
​
mysqlbinlog --start-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
​
#基于结束时间
​
mysqlbinlog --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot
​
#基于中间时间
​
mysqlbinlog --start-datetime="2022-12-23 16:17:59" --stop-datetime="2022-12-23 16:17:59" mysql-bin.000003 | mysql -uroot

XtraBackup 8.0.35-33 使用指南

简介

XtraBackup 8.0.35-33 是 Percona 提供的一个开源热备份工具,用于 MySQL 8.0 数据库的物理备份和恢复。它是 MySQL 企业级备份解决方案的重要组成部分。

安装

在基于 RPM 的系统上安装

bash 复制代码
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release enable-only tools release
sudo yum install percona-xtrabackup-80

在基于 Debian 的系统上安装

bash 复制代码
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo percona-release enable-only tools release
sudo apt-get update
sudo apt-get install percona-xtrabackup-80

基本使用

1. 完整备份

bash 复制代码
xtrabackup --backup --target-dir=/path/to/backup --user=username --password=password

2. 准备备份(应用日志)

bash 复制代码
xtrabackup --prepare --target-dir=/path/to/backup

3. 恢复备份

bash 复制代码
xtrabackup --copy-back --target-dir=/path/to/backup

高级使用案例

案例1:增量备份

1.首先进行完整备份:

bash 复制代码
xtrabackup --backup --target-dir=/backups/full --user=root --password=yourpassword

2.进行第一次增量备份:

bash 复制代码
xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/full --user=root --password=yourpassword

3.进行第二次增量备份:

bash 复制代码
xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1 --user=root --password=yourpassword

4.准备完整备份:

bash 复制代码
xtrabackup --prepare --apply-log-only --target-dir=/backups/full

5.应用第一个增量备份:

bash 复制代码
xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1

6.应用第二个增量备份:

bash 复制代码
xtrabackup --prepare --target-dir=/backups/full --incremental-dir=/backups/inc2

案例2:压缩备份

bash 复制代码
xtrabackup --backup --compress --target-dir=/backups/compressed --user=root --password=yourpassword

解压并准备备份:

bash 复制代码
xtrabackup --decompress --target-dir=/backups/compressed
xtrabackup --prepare --target-dir=/backups/compressed

案例3:并行备份和恢复

bash 复制代码
xtrabackup --backup --parallel=4 --target-dir=/backups/parallel --user=root --password=yourpassword

并行压缩:

bash 复制代码
xtrabackup --backup --compress --compress-threads=4 --parallel=4 --target-dir=/backups/parallel_compressed --user=root --password=yourpassword

案例4:加密备份

1.生成加密密钥:

bash 复制代码
openssl rand -base64 24 > /backups/encryption_key

2.创建加密备份:

bash 复制代码
xtrabackup --backup --target-dir=/backups/encrypted --encrypt=AES256 --encrypt-key-file=/backups/encryption_key --user=root --password=yourpassword

3.解密备份:

bash 复制代码
xtrabackup --decrypt=AES256 --encrypt-key-file=/backups/encryption_key --target-dir=/backups/encrypted

案例5:流式备份

1.备份到单个压缩文件:

bash 复制代码
xtrabackup --backup --stream=xbstream --user=root --password=yourpassword | gzip > /backups/backup.xbstream.gz

2.从流式备份恢复:

bash 复制代码
gunzip -c /backups/backup.xbstream.gz | xbstream -x -C /var/lib/mysql
xtrabackup --prepare --target-dir=/var/lib/mysql

常用选项说明

选项 描述
--backup 执行备份操作
--prepare 准备备份以进行恢复
--copy-back 将备份复制回原始位置
--target-dir 指定备份目标目录
--user MySQL 用户名
--password MySQL 密码
--host MySQL 主机地址
--port MySQL 端口
--parallel 并行线程数
--compress 启用压缩
--compress-threads 压缩线程数
--encrypt 加密算法
--encrypt-key-file 加密密钥文件
--incremental-basedir 增量备份的基础目录
--incremental-dir 增量备份目录
--stream 流式备份格式 (xbstream)

注意事项

  1. 确保有足够的磁盘空间存放备份文件

  2. 备份期间数据库负载可能会增加

  3. 恢复前确保 MySQL 服务已停止

  4. 恢复后可能需要调整文件权限

  5. 定期测试备份的可用性

最佳实践

  1. 定期进行完整备份和增量备份

  2. 备份文件存储在不同于数据库服务器的位置

  3. 实施备份验证流程

  4. 记录备份和恢复过程

  5. 监控备份作业的状态和持续时间

通过以上指南,您可以充分利用 XtraBackup 8.0.35-33 的强大功能来保护您的 MySQL 数据。

MyDumper 详细使用指南

MyDumper 是一个高性能的 MySQL 逻辑备份工具,相比传统的 mysqldump 具有并行备份、快照一致性等优势。以下是 MyDumper 的详细使用方式和案例。

安装 MyDumper

Ubuntu/Debian 系统

bash 复制代码
sudo apt-get install mydumper

CentOS/RHEL 系统

bash 复制代码
sudo yum install mydumper

从源码编译

bash 复制代码
git clone https://github.com/mydumper/mydumper.git
cd mydumper
mkdir build
cd build
cmake ..
make
make install

基本使用

1. 完整备份数据库

bash 复制代码
mydumper -u [username] -p [password] -h [host] -P [port] -o /backup/directory

2. 恢复数据库

bash 复制代码
myloader -u [username] -p [password] -h [host] -P [port] -d /backup/directory

常用参数说明

参数 描述 示例
-u 用户名 -u root
-p 密码 -p secret
-h 主机地址 -h 127.0.0.1
-P 端口号 -P 3306
-o 输出目录 -o /backups
-d 恢复时指定备份目录 -d /backups
-B 指定备份的数据库 -B db1,db2
-T 指定备份的表 -T db1.table1
-t 线程数 -t 8
-c 压缩输出 -c
-v 详细输出 -v 3
-C 压缩备份文件 -C
-e 备份表结构 -e
-r 分割表的行数 -r 100000
-F 按大小分割备份文件(MB) -F 256
-s 一致性快照 -s

使用案例

案例1:备份单个数据库

bash 复制代码
mydumper -u root -p password -h localhost -B mydatabase -o /backups/mydatabase

案例2:备份多个特定表

bash 复制代码
mydumper -u root -p password -h localhost -T db1.table1,db1.table2 -o /backups/tables

案例3:多线程备份(8个线程)

bash 复制代码
mydumper -u root -p password -h localhost -t 8 -o /backups/full

案例4:压缩备份

bash 复制代码
mydumper -u root -p password -h localhost -c -o /backups/compressed

案例5:按100万行分割表数据

bash 复制代码
mydumper -u root -p password -h localhost -r 1000000 -o /backups/split

案例6:备份数据库结构(不备份数据)

bash 复制代码
mydumper -u root -p password -h localhost -e -o /backups/schema

案例7:恢复数据库到不同名称

bash 复制代码
myloader -u root -p password -h localhost -d /backups/full -B new_db_name

案例8:只恢复特定表

bash 复制代码
myloader -u root -p password -h localhost -d /backups/full -T db1.table1

高级功能

1. 一致性快照备份

bash 复制代码
mydumper -u root -p password -h localhost -s -o /backups/snapshot

2. 正则表达式过滤表

bash 复制代码
mydumper -u root -p password -h localhost -x '^sakila\.(actor|film)' -o /backups/regex

3. 备份时排除某些表

bash 复制代码
mydumper -u root -p password -h localhost -B sakila -X '^sakila\.film_text' -o /backups/exclude

4. 长查询超时设置

bash 复制代码
mydumper -u root -p password -h localhost --long-query-retries=10 --long-query-retry-interval=30 -o /backups/timeout

5. 只备份数据不备份结构

bash 复制代码
mydumper -u root -p password -h localhost --no-schemas -o /backups/data_only

实际应用场景

场景1:生产环境每日备份

bash 复制代码
# 备份脚本
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/mysql/$DATE"
LOG_FILE="/var/log/mydumper_${DATE}.log"
​
mydumper -u backup_user -p backup_pass -h 10.0.0.1 -P 3306 -t 4 -c -v 3 -o $BACKUP_DIR > $LOG_FILE 2>&1
​
# 保留7天备份
find /backups/mysql/ -type d -mtime +7 -exec rm -rf {} \;

场景2:大数据表部分恢复

bash 复制代码
# 只恢复用户表的前100万条数据
myloader -u root -p password -h localhost -d /backups/full -T db.users --rows=1000000

场景3:跨服务器迁移数据库

bash 复制代码
# 源服务器
mydumper -u root -p password -h source_host -B db_to_migrate -c -o /tmp/db_backup
​
# 目标服务器
myloader -u root -p password -h target_host -d /tmp/db_backup

注意事项

  1. 确保备份用户有足够的权限(至少需要 SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT 权限)

  2. 大数据库备份时考虑磁盘空间

  3. 备份期间可能会对生产数据库性能产生影响

  4. 恢复前最好在测试环境验证备份文件

  5. 考虑使用--no-locks选项减少锁表时间(但可能影响一致性)

性能优化建议

  1. 根据服务器CPU核心数设置适当的线程数(-t)

  2. 对大表使用-r参数分割备份文件

  3. 使用-c或-C参数压缩备份减少存储空间

  4. 考虑使用--no-locks选项减少锁表时间(如果允许不一致)

  5. 对于InnoDB表,使用-s参数获取一致性快照

通过合理配置MyDumper,您可以高效地完成MySQL数据库的备份和恢复工作,满足各种业务场景的需求。

mysqlhotcopy 使用指南

mysqlhotcopy 是 MySQL 提供的一个 Perl 脚本工具,用于快速备份 MyISAM 和 ARCHIVE 表。它通过直接复制数据库文件来实现快速备份,比逻辑备份工具如 mysqldump 更快,但只适用于特定存储引擎。

安装与准备

mysqlhotcopy 通常随 MySQL 客户端一起安装,位于 MySQL 的 bin 目录下。

检查是否安装

bash 复制代码
which mysqlhotcopy

确保依赖安装(Perl 模块)

bash 复制代码
sudo apt-get install perl-dbi perl-dbd-mysql  # Debian/Ubuntu
sudo yum install perl-DBI perl-DBD-Mysql     # CentOS/RHEL

基本语法

bash 复制代码
mysqlhotcopy [options] db_name [/path/to/backup/directory]

常用选项

选项 描述
--user= MySQL 用户名
--password= MySQL 密码
--host= MySQL 主机
--port= MySQL 端口
--socket= MySQL socket 文件
--regexp= 使用正则表达式匹配数据库
--allowold 不覆盖现有备份,添加 _old 后缀
--keepold 不删除被覆盖的备份
--noindices 不备份索引文件
--method= 复制方法 (cp 或 scp)
--flushlog 备份后刷新日志
--resetmaster 备份后重置二进制日志
--resetslave 备份后重置从库信息
--addtodest 添加而不是替换目标目录
--dryrun 模拟执行,不实际复制

使用案例

案例1:备份单个数据库

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword mydatabase /backup/mysql

案例2:备份多个数据库

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword db1 db2 db3 /backup/mysql

案例3:使用正则表达式备份匹配的数据库

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --regexp='^test_' /backup/mysql

案例4:保留旧备份

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --allowold --keepold mydatabase /backup/mysql

案例5:远程备份到其他服务器

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --method=scp mydatabase user@remotehost:/remote/backup/dir

案例6:不备份索引文件

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --noindices mydatabase /backup/mysql

案例7:备份后刷新日志

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --flushlog mydatabase /backup/mysql

案例8:模拟运行(不实际备份)

bash 复制代码
mysqlhotcopy --user=root --password=yourpassword --dryrun mydatabase /backup/mysql

实际应用场景

场景1:生产环境每日备份脚本

bash 复制代码
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/mysql/$DATE"
LOG_FILE="/var/log/mysqlhotcopy_${DATE}.log"
​
# 确保备份目录存在
mkdir -p $BACKUP_DIR
​
# 备份所有数据库
mysqlhotcopy --user=backup_user --password=backup_pass \
    --allowold --keepold \
    --flushlog \
    --regexp='.*' \
    $BACKUP_DIR > $LOG_FILE 2>&1
​
# 删除7天前的备份
find /backup/mysql/ -type d -mtime +7 -exec rm -rf {} \;

场景2:备份特定表

bash 复制代码
# 备份 mydatabase 中的 table1 和 table2
mysqlhotcopy --user=root --password=yourpassword \
    mydatabase.table1 mydatabase.table2 \
    /backup/mysql

场景3:增量备份策略

bash 复制代码
#!/bin/bash
DATE=$(date +%Y%m%d)
FULL_BACKUP_DIR="/backup/mysql/full"
INC_BACKUP_DIR="/backup/mysql/inc_$DATE"
​
# 每周日做完整备份
if [ $(date +%u) -eq 7 ]; then
    mysqlhotcopy --user=backup_user --password=backup_pass \
        --allowold --keepold \
        --flushlog \
        --regexp='.*' \
        $FULL_BACKUP_DIR
else
    # 其他日子做增量备份
    mysqlhotcopy --user=backup_user --password=backup_pass \
        --addtodest \
        --regexp='.*' \
        $INC_BACKUP_DIR
fi

恢复数据库

mysqlhotcopy 的恢复是通过直接复制文件回原始位置实现的:

1.停止 MySQL 服务

bash 复制代码
systemctl stop mysql

2.复制备份文件到 MySQL 数据目录

bash 复制代码
cp -R /backup/mysql/mydatabase /var/lib/mysql/

3.确保文件权限正确

bash 复制代码
chown -R mysql:mysql /var/lib/mysql/mydatabase

4.启动 MySQL 服务

bash 复制代码
systemctl start mysql

注意事项

  1. 存储引擎限制:mysqlhotcopy 只适用于 MyISAM 和 ARCHIVE 表,不适用于 InnoDB

  2. 锁表:mysqlhotcopy 在备份期间会锁定表,可能导致应用程序短暂阻塞

  3. 备份一致性:对于正在写入的表,备份可能不一致

  4. 权限要求

    • 执行用户需要有读取数据库文件的权限

    • MySQL 用户需要 SELECT、RELOAD、LOCK TABLES 权限

  5. 备份完整性:备份后建议验证备份文件的完整性

  6. 版本兼容性:确保备份和恢复使用相同版本的 MySQL

性能优化建议

  1. 在低峰期执行备份操作

  2. 对于大型数据库,考虑分批备份

  3. 使用 --noindices 选项可以加快备份速度(但恢复时需要重建索引)

  4. 考虑使用 --method=scp 直接备份到远程服务器,减少本地磁盘IO

  5. 对于频繁更新的表,考虑结合 FLUSH TABLES 命令确保数据一致性

替代方案

由于 mysqlhotcopy 的局限性,现代 MySQL 环境通常使用以下替代方案:

  • 对于 InnoDB 表:使用 Percona XtraBackup

  • 逻辑备份:使用 mysqldump 或 mydumper

  • 文件系统快照:LVM 快照或存储设备快照功能

mysqlhotcopy 最适合用于 MyISAM 表的快速备份场景,特别是当数据库大小适中且可以接受短暂锁表的情况下。

附录 A mysqld配置文件

bash 复制代码
# mysqld配置文件
​
# ----------------- 客户端配置 -----------------
[client]
port = 3306 # 客户端连接数据库的端口,默认为3306
socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock
​
# ----------------- MySQL客户端工具配置 -----------------
[mysql]
default-character-set=utf8mb4 # 客户端连接数据库时的默认字符集,这里使用utf8mb4
​
# ----------------- 服务器配置 -----------------
[mysqld]
user = mysql # 运行数据库服务器的系统用户,默认为mysql
port = 3306 # 服务器监听的端口,默认为3306
socket = /var/lib/mysql/mysql.sock # 服务器socket文件的路径,默认为/var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysql.pid # 服务器进程ID保存的文件路径,默认为/var/lib/mysql/mysql.pid
bind-address = 127.0.0.1 # 服务器绑定的IP地址,默认为本地回环地址
​
# ----------------- 日志配置 -----------------
log-error = /var/log/mysql/error.log # 错误日志文件路径,默认为/var/log/mysql/error.log
slow-query-log = 1 # 是否启用慢查询日志,1表示启用,0表示禁用,默认为禁用
slow-query-log-file = /var/log/mysql/slow.log # 慢查询日志文件路径,默认为/var/log/mysql/slow.log
​
# ----------------- 缓存配置 -----------------
query_cache_type = 1 # 查询缓存类型,1表示启用,0表示禁用,默认为禁用
query_cache_size = 32M # 查询缓存大小,默认为32M
query_cache_limit = 2M # 查询缓存单个查询的最大缓存大小,默认为2M
​
# ----------------- 字符集配置 -----------------
character-set-server = utf8mb4 # 服务器使用的字符集,默认为utf8mb4
collation-server = utf8mb4_unicode_ci # 服务器使用的字符集排序规则,默认为utf8mb4_unicode_ci
​
# ----------------- 默认存储引擎 -----------------
default-storage-engine = InnoDB # 默认使用的存储引擎,默认为InnoDB
​
# ----------------- InnoDB配置 -----------------
innodb_buffer_pool_size = 256M # InnoDB缓冲池大小,默认为256M
innodb_flush_log_at_trx_commit = 2 # 日志刷新策略,2表示每秒刷新,默认为每次事务提交刷新
innodb_log_buffer_size = 8M # InnoDB日志缓冲区大小,默认为8M
innodb_file_per_table = 1 # 是否为每个InnoDB表使用单独的表空间,1表示启用,0表示禁用,默认为启用
innodb_open_files = 400 # InnoDB打开的文件数量,默认为400
​
# ----------------- 网络和连接配置 -----------------
max_connections = 1000 # 最大并发连接数,默认为1000
max_allowed_packet = 16M # 允许的最大数据包大小,默认为16M
skip_external_locking = 1 # 是否禁用外部锁定,默认为是
​
# ----------------- 安全性配置 -----------------
secure-file-priv = /var/lib/mysql-files # 加载数据文件的安全目录,默认为/var/lib/mysql-files
sql-mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 服务器的SQL模式,默认为NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

附录 B mysql常见内置函数

一、字符串函数

bash 复制代码
-- ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL
SELECT ASCII("dd");-- 100
SELECT ASCII("dc");-- 100
 
-- CONCAT(str1,str2,...):返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式
select CONCAT('My', 'S', 'QL'); -- MySQL
select CONCAT('My', NULL, 'QL'); -- NULL
select CONCAT(14.3); -- 14.3
 
-- LENGTH(str):返回字符串str的字节长度
select LENGTH('text'); -- 4
select LENGTH('字符串');-- 9
 
-- CHAR_LENGTH(str):用于获取字符串长度
select CHAR_LENGTH('text'); -- 4
select CHAR_LENGTH('字符串');-- 3
 
-- LOCATE(substr,str):返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0
select LOCATE('bar', 'foobarbar'); -- 4
select LOCATE('xbar', 'foobar'); -- 0
 
-- INSTR(str,substr):返回子串substr在字符串str中的第一个出现的位置
select INSTR('foobarbar', 'bar'); -- 4
select INSTR('xbar', 'foobar'); -- 0
 
-- LEFT(str,len)/RIGHT(str,len):返回字符串str的最左/右面len个字符
select LEFT('foobarbar', 5); -- fooba
select RIGHT('foobarbar', 4); -- rbar
 
-- SUBSTRING(str,pos):从字符串str的起始位置pos返回一个子串
select SUBSTRING('foobarbar',5);-- arbar
 
-- TRIM(str):返回字符串str,所有前缀或后缀被删除了
select TRIM(' xbar ');-- xbar
 
-- LTRIM(str)/RTRIM(str):返回删除了其前/后置空格字符的字符串str。
select LTRIM(' xbar');-- xbar
select RTRIM('xbar ');--xbar
 
-- REPLACE(str,from_str,to_str):返回字符串str,其字符串from_str的所有出现由字符串to_str代替
select REPLACE('xbar', 'x', 'bar');-- barbar
 
-- REPEAT(str,count):返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL
select REPEAT('bar', 3);-- barbarbar
 
-- REVERSE(str):返回颠倒字符顺序的字符串str。
select REVERSE('bar');-- rab
 
-- INSERT(str,pos,len,newstr):返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr代替。 
select INSERT(whatareyou', 5, 3, is');-- whatisyou
 
-- strcmp(str1,str2):用于比较两个字符串的大小。左大于右时返回1,左等于右时返回0,,左小于于右时返回-1
SELECT strcmp('ab','ac');-- -1
 
-- 大写:upper(x),ucase(x);小写lower(x),lcase(x):字母大小写转换函数;
SELECT UPPER("abc");-- ABC
SELECT UCASE("abc");-- ABC
SELECT LOWER("ABC");-- abc
SELECT LCASE("ABC");-- abc
 
-- find_in_set(str1,str2):返回字符串str1在str2中的位置,str2包含若干个以逗号分隔的字符串(可以把str2看出一个列表,元素是多个字符串,查找结果是str1在str2这个列表中的索引位置,从1开始)
SELECT FIND_IN_SET('abc','123,456,abc');-- 3
 
-- field(str,str1,str2,str3...):与find_in_set类似,但str2由一个类似列表的字符串变成了多个字符串,返回str在str1,str2,str3...中的位置。
SELECT FIELD('abc','123','456','abc');-- 3
 
-- elt(index,str1,str2,str3...):获取指定位置的字符串
SELECT elt(3,'123','456','abc');-- abc

二、日期时间函数

bash 复制代码
-- curdate()/current_date():获取当前日期
SELECT curdate();-- 2018-08-09
SELECT current_date();-- 2018-08-09
 
-- curtime()/current_time():获取当前时间
SELECT curtime();-- 15:38:54
SELECT current_time();-- 15:38:54
 
-- now():获取当前日期时间
select now();-- 2018-08-09 15:40:09
 
-- month(date),monthname(date):获取日期月份
SELECT MONTH (now());-- 8
SELECT monthname(now());-- August
 
-- week(date):获取日期周数
select week(now());-- 31
 
-- year(date):获取日期年数
select year(now());-- 2018
 
-- hour(time):获取时间时刻
select hour(now());-- 15
 
-- minute(time):获取时间分钟数
select minute(now());-- 47
 
-- DAYOFWEEK(date)/DAYNAME(date)/WEEKDAY(date):获取时间星期数
select DAYOFWEEK(NOW());-- 5
select DAYNAME(now());-- Thursday
select WEEKDAY(now());-- 3
 
-- DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type):进行日期增加/减少的操作,可以精确到秒
SELECT '2018-08-09'+INTERVAL 1 DAY;-- 2018-08-10
SELECT '2018-08-09'-INTERVAL 1 SECOND;-- 2018-08-08 23:59:59
SELECT DATE_ADD('2018-08-08 23:59:59',INTERVAL 1 SECOND);-- 2018-08-09 00:00:00
SELECT DATE_SUB('2018-08-09 00:01:01',INTERVAL '1:1' MINUTE_SECOND);-- 2018-08-09 00:00:00
 
-- date_format('time','format')/time_format(time,format):日期时间转换为字符串
select date_format(now(), '%Y%m%d%H%i%s');-- 20180809160315
select time_format(now(),'%H:%i:%s');--16:03:15
 
-- str_to_date(str, format):字符串转换为日期
select str_to_date('08.09.2018 16:06:30', '%m.%d.%Y %H:%i:%s');-- 2018-08-09 16:06:30
 
-- makdedate(year,dayofyear)/maketime(hour,minute,second):拼凑日期、时间函数
select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'
 
-- unix_timestamp()/unix_timestamp(date)/from_unixtime(unix_timestamp)/from_unixtime(unix_timestamp,format):Unix 时间戳、日期转换函数
select unix_timestamp(); -- 1533802315
select unix_timestamp(now());-- 1533802315
select from_unixtime(1533802315); -- 2018-08-09 16:11:55
select from_unixtime(1533802315, '%Y%m%d%H%i%s'); -- 20180809161155

三、数学函数

bash 复制代码
-- ABS(X):返回X的绝对值
select ABS(-32);-- 32
 
-- MOD(N,M)或%:返回N被M除的余数
select MOD(15,7);-- 1
select 15 % 7; -- 1
 
-- FLOOR(X):返回不大于X的最大整数值
select FLOOR(1.23); -- 2
select FLOOR(-1.23); -- -2
 
-- CEILING(X)/ceil(x):返回不小于X的最小整数值
select CEILING(1.23);-- 2 
select CEILING(-1.23); -- -1
 
-- ROUND(X) :返回参数X的四舍五入的一个整数。 
select ROUND(1.58); -- 2
select ROUND(-1.58); -- -2
 
-- round(x,y):返回数值x带有y为小数结果的数值(四舍五入)
SELECT round(3.1415926,2);-- 3.14
 
-- rand():返回随机数
select rand();-- 0.5911854436538978
 
-- truncate(x,y):返回数值x截取y位小数的结果(不四舍五入)
select truncate(3.1415926,4);-- 3.1415

四、逻辑函数

bash 复制代码
-- CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END:在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。
SELECT
    CASE 1
WHEN 1 THEN
    2
ELSE
    3
END;-- 2
 
-- IF(expr1,expr2,expr3):如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定
SELECT IF(1>2,2,3);-- 3
 
-- STRCMP(expr1,expr2):如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1
select STRCMP('text', 'text2');-- -1
 
-- SELECT IFNULL(expr1,expr2):如果expr1为空则返回expr2否则返回expr1
SELECT IFNULL(1,2);-- 2

五、加密函数

bash 复制代码
-- MD5(str):函数可以对字符串str进行加密。MD5(str)函数主要对普通的数据进行加密。下面使用MD5(str)函数为字符串"abcd"加密
SELECT MD5('abcd');-- e2fc714c4727ee9395f324cd2e7f331f
 
-- ENCODE(str,pswd_str):函数可以使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。
SELECT ENCODE("abcd","evan");
 
-- DECODE(crypt_str,pswd_str)函数可以使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密时的字符串pswd_str是相同的。下面使用DECODE(crypt_str,pswd_str)为ENCODE(str,pswd_str)加密的数据解密。
SELECT DECODE(ENCODE("abcd","evan"),"evan");
相关推荐
yuanManGan2 小时前
走进Linux的世界:冯诺依曼体系结构
linux
瀚高PG实验室2 小时前
数据库安全配置指导
服务器·数据库·瀚高数据库
憋问我,我也不会2 小时前
MYSQL 命令
数据库·mysql
new_daimond2 小时前
Linux 服务器内存监控与优化指南
linux·服务器·chrome
一介草民丶2 小时前
Linux | Mongodb 6 离线安装
linux·运维·mongodb
赖small强2 小时前
Linux 线程相关结构对照表与关系图
linux·thread_info·task_struct·thread_struct
Justin_192 小时前
部署zabbix
linux·centos·zabbix
STUPID MAN3 小时前
Linux使用tomcat发布vue打包的dist或html
linux·vue.js·tomcat·html
24K老游3 小时前
postgres15 flink cdc同步测试
数据库