当前位置: 首页 > news >正文

《MySQL 入门:数据库世界的第一扇门》

一、MySQL 简介

MySQL 是一种开源的关系型数据库管理系统,在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称,广泛应用于网站、企业级应用、数据分析等领域。

MySQL 具有诸多优点。首先,它成本低,作为开源软件,可以免费使用和修改。其次,性能强,执行速度快,能够处理大量的数据请求。同时,MySQL 体积小,简单实用,对初学者友好,容易安装和使用。

在性能方面,MySQL 拥有优化的 SQL 查询算法,能有效地提高查询速度。它支持多线程,充分利用 CPU 资源,既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。此外,MySQL 提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS 等都可以用作数据表名和数据列名。它还提供 TCP/IP、ODBC 和 JDBC 等多种数据库连接途径,以及用于管理、检查、优化数据库操作的管理工具。MySQL 支持大型的数据库,可以处理拥有上千万条记录的大型数据库,并且支持多种存储引擎。

MySQL 的存储引擎丰富多样,各有特点。MyISAM 是 MySQL 5.0 之前的默认数据库引擎,拥有较高的插入,查询速度,但不支持事务。InnoDB 是事务型数据库的首选引擎,支持 ACID 事务,支持行级锁定,从 MySQL 5.5 起成为默认数据库引擎。BDB 也是事务型数据库的另一种选择,支持 Commit 和 Rollback 等其他事务特性。Memory 存储引擎所有数据置于内存,拥有极高的插入,更新和查询效率,但会占用和数据量成正比的内存空间,且内容会在 MySQL 重新启动时丢失。Merge 将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用。Archive 非常适合存储大量的独立的,作为历史记录的数据。Federated 将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。CSV 存储引擎逻辑上由逗号分割数据,不支持索引。BlackHole 是黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继。EXAMPLE 存储引擎是一个不做任何事情的存根引擎,主要用于演示如何编写新存储引擎。

索引是 MySQL 中一种特殊的文件,包含着对数据表里所有记录的引用指针。索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程度上弥补这一缺陷,许多 SQL 命令都有一个 DELAY_KEY_WRITE 项,可暂时制止 MySQL 在插入或修改记录后立刻对索引进行刷新,等到全部记录插入 / 修改完毕之后再进行。在需要插入许多新记录的场合,这个选项作用非常明显。另外,索引还会在硬盘上占用相当大的空间。

二、安装与配置 MySQL

1. Windows 安装与配置

  1. 下载安装包,执行 “典型安装”,勾选 “添加到 PATH”。在安装 MySQL 时,首先需要从官网下载适合 Windows 系统的安装程序。运行安装程序并遵循向导,选择 “典型安装” 选项,确保在安装过程中勾选 “添加到 PATH”,这样便于在命令行中直接使用 MySQL 命令。
  1. 安装完成后,以命令行方式运行 mysql -u root -p 进入 MySQL 命令行界面。安装完成后,可以通过命令行方式运行 “mysql -u root -p”,然后输入密码即可进入 MySQL 命令行界面,开始对数据库进行操作。

2. Linux 安装与配置

  1. 借助包管理器安装,如 Ubuntu 使用 sudo apt update 和 sudo apt install mysql-server。在 Linux 系统中,以 Ubuntu 为例,可以借助包管理器进行安装。首先打开终端,输入 “sudo apt update” 更新软件列表,然后输入 “sudo apt install mysql-server” 安装 MySQL 服务器。
  1. 运行 sudo systemctl start mysql 启动服务,使用 sudo systemctl status mysql 检查服务状态。安装完成后,可以运行 “sudo systemctl start mysql” 启动服务,然后使用 “sudo systemctl status mysql” 检查服务状态,确保 MySQL 服务正常运行。

3. macOS 安装与配置

  1. 通过 Homebrew 安装或直接下载安装包,运行安装脚本,进行服务启动与配置。在 macOS 系统中,可以通过 Homebrew 安装 MySQL,也可以直接从官网下载安装包进行安装。安装完成后,运行安装脚本,进行服务启动与配置,确保 MySQL 在 macOS 系统上正常运行。

三、MySQL 基本操作

1. 创建数据库和表

  1. 使用 CREATE DATABASE 命令创建数据库。

在 MySQL 中,我们使用 “CREATE DATABASE” 命令来创建数据库。这是一个非常简单且基础的命令,其语法为:CREATE DATABASE 数据库名。例如,如果你想创建一个名为 “test_db” 的数据库,那么你需要执行的命令就是:CREATE DATABASE test_db。执行这个命令后,MySQL 会在服务器上创建一个新的数据库,名为 “test_db”。

  1. 在创建的数据库中,利用 CREATE TABLE 命令建立表,并定义表的字段。

在创建了数据库后,我们可以使用 CREATE TABLE 命令在数据库中建立表。例如,在 “test_db” 数据库中创建一个名为 “users” 的表,包含 id、name 和 age 三个列,可以使用以下命令:CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR (50) NOT NULL,age INT NOT NULL); 在这个例子中,id 列是整数类型,具有主键属性且自动递增;name 列是可变长度字符串类型,不允许为空;age 列是整数类型,不允许为空。

2. 数据类型与字段设置

  1. MySQL 支持多种数据类型,如 INT、VARCHAR、CHAR、TEXT、DATE 和 DATETIME、BOOLEAN 等。

MySQL 的数据类型主要包括以下五大类:整数类型(如 BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、INT、BIG INT);浮点数类型(如 FLOAT、DOUBLE、DECIMAL);字符串类型(如 CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB);日期类型(如 Date、DateTime、TimeStamp、Time、Year);其他数据类型(如 BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection 等)。

  1. 每个字段可设置特定属性,如默认值、非空约束、唯一性检查等。

每个字段可以设置特定的属性,比如非空约束(NOT NULL)表示该字段的值不能为空;默认值(DEFAULT)表示如果插入数据时没有给该字段赋值,那么就使用默认值;唯一性检查(UNIQUE KEY)表示该字段下的值不能重复,null 除外。例如,以下语句将创建一个名为 “students” 的表,并设置 name 列不允许为空,age 列默认值为 18:CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR (50) NOT NULL,age INT DEFAULT 18);

3. 基础 SQL 查询

  1. 使用 SELECT 语句查询并获取数据,可添加 WHERE 子句进行条件查询。

SELECT 语句用于从数据库中检索数据。例如,从 “users” 表中选择所有列可以使用以下命令:SELECT * FROM users; 若要选择特定列,可以指定列名,如:SELECT id, name FROM users;WHERE 子句用于过滤查询结果。例如,仅显示 age 大于 20 的用户:SELECT * FROM users WHERE age > 20;

4. 数据操作

  1. 插入数据:使用 INSERT INTO 语句。

使用 INSERT INTO 语句向表中插入数据。例如,向 “users” 表中插入一条数据:INSERT INTO users (name, age) VALUES ('John', 25); 如果有列是必填,那就需要带上。自动编号的列不用填写,它会自动获得。填入值得时候除了数值不用加单引号,其他类型的值都要加单引号。我们还可以用 SYSDATE () 获取系统时间。可以用 PASSWORD (值),将数值 MD5 加密。

  1. 更新数据:使用 UPDATE 语句。

更新表中的数据使用 UPDATE。例如,将 “users” 表中 name 为 'John' 的用户的 age 更新为 26:UPDATE users SET age = 26 WHERE name = 'John';

  1. 删除数据:使用 DELETE FROM 语句。

删除表中的数据使用 DELETE FROM。例如,删除 “users” 表中 age 小于 18 的用户:DELETE FROM users WHERE age < 18;

四、数据完整性管理

在 MySQL 中,主键与外键用于维护数据一致性,确保数据的唯一性和关联性。

一、主键的作用

主键是能确定一条记录的唯一标识,在 MySQL 中,你可以通过创建主键来确保表中某个字段的唯一性。例如,学生表中的学号可以作为主键,每个学生的学号是唯一的,能唯一标识该学生的记录。主键具有以下特点:

  1. 唯一性:保证列中的每个值都是唯一的。
  1. 非空性:主键列不能有 NULL 值。
  1. 索引:MySQL 会自动为主键列创建索引,优化查询性能。

创建表时可以定义主键,语法如下:

 

CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,...PRIMARY KEY(column_name));

修改现有表也可以添加主键:

 

ALTER TABLE table_name ADD PRIMARY KEY(column_name);

还可以使用复合主键,当某一列不能唯一识别每行时,可将两列或多列看为一个整体作为主键,语法如下:

 

CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,...PRIMARY KEY(column1, column2, column3));

二、外键的作用

外键用于与另一张表的关联,以另一个表的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。表的外键值必须在主表中能找到。当主表的记录被从表参照时,主表的记录不允许删除。

例如,class 表与 Student 表通过 class_id 关联,实现一对多的关系。class_id 作为 Student 表的外键,Student 表为从表,在 class 表中为主键,class 表为主表。

创建外键的语法如下:

 

-- 主表

CREATE TABLE 表1(列名1 数据类型 primary key,列名2 数据类型);

-- 从表(外键约束所在的表)

CREATE TABLE 表2(FK_列名1 数据类型,列名2 数据类型,constraint 外键约束的名字 foreign key(从表的列名1) references 主表表名(主表的列名1));

三、主键与外键维护数据一致性

  1. 插入新记录时,首先插入主表(具有自增主键的表),然后获取该主键的值,再插入到子表(拥有外键的表)。
    • 示例代码:
 

-- 插入主表记录

INSERT INTO parent_table (column1, column2) VALUES ('value1', 'value2');

-- 获取自增主键

SELECT LAST_INSERT_ID();

-- 插入子表记录

INSERT INTO child_table (foreign_key_column, column1, column2) VALUES (LAST_INSERT_ID(), 'value1', 'value2');

  1. 更新主表记录时,同样需要同步更新子表中的相关记录。
    • 示例代码:
 

-- 更新主表记录

UPDATE parent_table SET column1 = 'new_value1' WHERE primary_key_column = 1;

-- 同步更新子表记录

UPDATE child_table SET column1 = 'new_value1' WHERE foreign_key_column = 1;

  1. 删除主表记录时,可以使用级联删除或者先删除子表中关联的记录,再删除主表记录。
    • 示例代码:
 

-- 级联删除

DELETE FROM parent_table WHERE primary_key_column = 1;

-- 或者先删除子表记录

DELETE FROM child_table WHERE foreign_key_column = 1;

DELETE FROM parent_table WHERE primary_key_column = 1;

为保证数据一致性,应该在定义外键时设置正确的删除规则,如 ON DELETE CASCADE,这样在删除主表记录时,子表中的相关记录会自动被删除。

五、MySQL 安全与权限管理

MySQL 的安全与权限管理至关重要,它通过用户账户和权限管理实现安全,确保数据访问的可控性。

用户和权限管理的存储位置

在 MySQL 5.7.24 中,关于用户及用户权限的相关信息,都保存在了 mysql 库中的 user 表中,可以将 user 表中大致分为用户列、权限列、安全列、资源控制列这几种。

用户列

user 表的用户列包括 Host、User、password,分别表示主机名、用户名和密码。其中 user 和 Host 为 user 表的联合主键。当用户与服务器之间建立连接时,输入的账户信息中的用户名称、主机名和密码必须匹配 user 表中对应的字段,只有 3 个值都匹配的时候,才允许连接的建立。这 3 个字段的值就是创建账户时保存的账户信息。修改用户密码时,实际就是修改 user 表的 password 字段值。

权限列

权限列的字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作。包括查询权限、修改权限等普通权限,还包括了关闭服务器、超级权限和加载用户等高级权限。普通权限用于操作数据库;高级权限用于数据库管理。user 表中对应的权限是针对所有用户数据库的。这些字段值的类型为 ENUM,可以取的值只能为 Y 和 N,Y 表示该用户有对应的权限;N 表示用户没有对应的权限。查看 user 表的结构可以看到,这些字段的值默认都是 N。如果要修改权限,可以使用 GRANT 语句或 UPDATE 语句更改 user 表的这些字段来修改用户对应的权限。

安全列

安全列只有 6 个字段,其中两个是 SSI 相关的,2 个是 x509 相关的,另外 2 个是授权插件相关的。SSI 用于加密;X509 标准可用于标识用户:Plugin 字段标识可以用于验证用户身份的插件,如果该字段为空,服务器使用内建授权验证机制验证用户身份。可以通过 SHOW VARIABLES LIKE ’have_openssl’语句来查询服务器是否支持 SSI 功能。

资源控制列

资源控制列的字段用来限制用户使用的资源,包含 4 个字段,分别为:

  1. Max_questions— 用户每小时允许执行的查询操作次数。
  1. Max_updates— 用户每小时允许执行的更新操作次数。
  1. Max_connections— 用户每小时允许执行的连接操作次数。
  1. Max_user_connections— 用户允许同时建立的连接次数。

一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时,才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。

注:若新建的用户无法登录到数据库,排除权限错误的前提下,可以尝试刷新权限,命令如下:mysql> flush privileges;

创建用户

  1. 使用 create
    • 语法格式:CREATE USER <用户> [IDENTIFIED BY [PASSWORD] 'password'] [, 用户 [IDENTIFIED BY [PASSWORD] 'password']]
    • 例:CREATE USER 'username'@'localhost' IDENTIFIED BY 'passwd';
  1. 使用 GRANT 新建用户
    • 语法格式:GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
    • priv_type 参数表示新用户的权限;database.table 参数表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限;user 参数指定新用户的账号,由用户名和主机名构成;IDENTIFIED BY 关键字用来设置密码;password 参数表示新用户的密码。
    • 例:GRANT SELECT ON . TO 'test'@localhost IDENTIFIED BY 'passwd';

修改用户

  1. 修改用户名
    • 语法格式:RENAME USER <旧用户> TO < 新用户 >< 旧用户 >:系统中已经存在的 MySQL 用户账号。< 新用户 >:新的 MySQL 用户账号。RENAME USER 语句用于对原有的 MySQL 用户进行重命名。若系统中旧账户不存在或者新账户已存在,该语句执行时会出现错误。使用 RENAME USER 语句,必须拥有 mysql 数据库的 UPDATE 权限或全局 CREATE USER 权限。
    • 例:RENAME USER 'test1'@'localhost' TO 'test02'@'localhost';
  1. 修改用户密码
    • 使用 set 修改
      • 语法格式:SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpasswd');
    • 使用 GRANT 修改
      • 语法格式:GRANT USAGE ON . TO 'user'@'hostname' IDENTIFIED BY 'newpasswd';
      • 例:GRANT USAGE ON . TO 'test'@'localhost' IDENTIFIED BY 'newpasswd';

删除用户

  1. 使用 DROP 删除用户
    • 语法格式:DROP USER 'username'@'host'[,user@host]...
    • 注意:用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,MySQL 不会记录是谁创建了这些对象
    • 例:DROP USER 'test1'@'localhost';
  1. 使用 DELETE 删除用户
    • 语法格式:DELETE FROM mysql.user WHERE Host='hostname' AND User='username';
    • 例:DELETE FROM mysql.user WHERE Host='localhost' AND User='test1';

查看用户权限

  1. 使用 SELECT 查询
    • 语法格式:SELETE * FROM 'username'@'hostname';
    • 注意:新建用户只有登录权限,没有任何其它权限,不能查询 user 表
  1. 使用 SHOW GRANTS FOR 查询
    • SHOW GRANTS FOR 'username'@'host'; #查看指定用户的权限
    • SHOW GRANTS FOR CURRENT_USER; #查看当前用户的权限

用户权限管理

  1. 赋予权限
    • GRANT 提权
    • GRANT 权限列表 ON 数据库名。表名 TO ' 用户名 '@' 来源地址’ [IDENTIFIED BY ' 密码 '];
    • #权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如 "select,insert,update"。使用 "all" 表示所有权限,可授权执行任何操作。
    • #数据库名。表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符 ""。例如,使用"sch." 表示授权操作的对象为 sch 数据库中的所有表。
    • #用户名 @来源地址 ': 用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用 "%" 通配符,表示某个区域或网段内的所有地址,如 "%.xyw.com"、"192.168.226.%" 等。
    • #IDENTIFIEDBY: 用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略 "IDENTIFIED BY" 部分,则用户的密码将为空。
    • #允许用户 zhangsan 在本地查询 sch 数据库中所有表的数据记录,但禁止查询其他数据库中的表的记录。
    • GRANT select ON sch.* To 'zhangsan'@'localhost' IDENTIFIED BY 'abc123 ';
    • #允许用户 lisi 在所有终端远程连接 mysql,并拥有所有权限。
    • GRANT ALL[PRIVILEGES] ON . TO 'lisi'@'%’ IDENTIFIED BY '123456';
    • flush privileges;# 刷新权限 (刷新的是权限表)
  1. 查看权限
    • 登录用户只能看自己(拥有所有权限的账户除外)
    • show grants for'zhangsan'@'%';
  1. 移除权限
    • revoke select on sch.* from 'zhangsan'@'%';
    • #USAGE 权限只能用于数据库登陆,不能执行任何操作;USAGE 权限不能被回收,即 REVOKE 不能删除用户。
    • flush privileges;

权限表的存取

对于身份的认证,MySQL 是通过 IP 地址和用户名联合进行确认的,例如 MySQL 安装后默认创建的用户 root@localhost 表示用户 root 只能从本地(localhost)进行连接才可以通过认证,在其他任何主机进行连接都将被拒绝,也就是说同一个用户,来自不同的 IP 地址,MySQL 将其视为不同的用户。

MySQL 的权限表在数据库启动的时候就载入了内存,当用户通过身份认证后,就在内存中进行相应权限的存取。在权限存取的两个过程中,系统会用到 “mysql” 数据库中的 user、host、db 这 3 个最重要的权限表,而 host 表在 MySQL:5.6.7 之后就删除了。

mysql 库 user 表中的列:user 表中的列主要分为 4 个部分:用户列、权限列、安全列、资源控制列。用的比较多的是用户列和权限列,权限列又分为普通权限和管理权限。普通权限主要用于数据库的操作,比如 select_priv、create_priv 等;管理权限主要用来对数据库进行管理的操作,比如 process_priv、super_priv 等。

当用户进行连接时,权限表的存取过程有以下两个阶段:

  1. 先从 user 表中的 host、user 和 password 这 3 个字段中判断连接的 IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。
  1. 通过身份验证,按照以下权限表的顺序得到数据库权限:user --> db --> tables_priv --> columns_priv。

说明:MySQL:8.0 以后 user 表中去掉了 password,取而代之的是 authentication_string,修改密码的方式:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘密码’;

下面举个例子解释一下权限表存取过程的第二个阶段:

  1. 创建用户 dongsq@localhost,并赋予所有数据库上的所有表的 select 权限。

说明:MySQL:8.0 之后不支持授权的时候就进行用户创建,所以创建之后才能授权;

  1. 再看 db 表:可以发现,user 表中的 select_priv 列是 "Y", 而 db 表中却没有,也就是说,对所有数据库都具有相同权限的用户记录并不需要记入 db 表,而仅仅需要将 user 表中的 select_priv 改为 "Y" 即可。换句话说,user 表中的每个权限都代表了对所有数据库都有的权限。
  1. 创建数据库 dongsq,将 dongsq@localhost 上的权限改为只针对 dongsq 数据库上所有表的 select 权限。这时候发现 user 表中的 select_priv 变为了 "N",而 db 表中增加了 db 为 dongsq 的一条记录。也就是说:当只授予部分数据库某些权限时,user 表中的相应权限列保持 "N",而将具体的数据库权限写入了 db 表,table 和 column 的权限机制和 db 相似。

账号管理

  1. 创建账号

上面提到过:MySQL:8.0 之后不支持授权的时候就进行用户创建,所以创建之后才能授权;

示例一:现在给 dongsq@localhost 增加 grant 权限:

 

mysql> grant all privileges on *.* to dongsq@localhost with grant option;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> select * from user where user = 'dongsq' and host='localhost' \\G;

*************************** 1. row ***************************

Host: localhost

User: dongsq

Select_priv: Y

Insert_priv: Y

Update_priv: Y

Delete_priv: Y

Create_priv: Y

Drop_priv: Y

Reload_priv: Y

Shutdown_priv: Y

Process_priv: Y

File_priv: Y

Grant_priv: Y

示例二:创建新用户 zhangsan,可以从任何 IP 进行连接,权限为对 dongsq 数据库里所有表进行 SELECT、UPDATE、INSERT 和 DELETE 操作,初始化密码为 ‘123456’

本例中的 IP 限制为所有 IP 都可以连接,因此设置为 %

说明:Host 值可以时主机名或 IP 号,或 "localhost"指出本地主机,可以在 Host 列值使用通配符字符"%"和"_"。"%"匹配任何主机名,空 Host 值等价于"%",他们的含义与 LIKE 操作符的模式匹配操作相同。

说明:如果权限表中 host 既有 % 又有 localhost,而此时,连接从主机 localhost 过来,显然 user 表中有两条记录都符合匹配条件,那系统会选择哪一个呢?如果有多个匹配,按照下述原则来解决:

  1. 服务器在启动时读入 user 表后进行排序,它首先以最具体的 Host 值排序,主机名和 IP 号时最具体的;
  1. 然后当用户试图连接时,以排序的顺序浏览条目;
  1. 服务器使用与客户端和用户名匹配的第一行;

很显然,当 user 表出现 localhost 和 % 时,从主机 localhost 过来,匹配的 host 为 "localhost" 对应的权限。

  1. 查看账号权限

示例三:查看账号权限

示例四:更改账号权限

权限的变更有两种方法:使用 GRANT (新增) 和 REVOKE (回收) 语句,或者变更权限表。第二种方法直接对 user、db、tables_priv 和 columns_priv 中的权限列进行更新即可,介绍一下第一种方法中 revoke

示例三中 zhangsan 账号有增删改查的四个权限,现在回收删除权限:

 

REVOKE DELETE ON dongsq.* FROM 'zhangsan'@'%';

示例五:删除账号

账号资源限制

账号资源限制这类选项的作用是限制每个账号实际具有的资源限制,这里的 "资源" 主要包括:

  1. 单个账号每小时执行的查询次数
  1. 单个账号每小时执行的更新次数
  1. 单个账号每小时连接服务器的次数
  1. 单个账号并发连接服务器的次数

在实际应用中可能会由于程序 bug 或者系统遭到攻击,使得应用短时间内发生了大量的点击,对数据库造成了严重的并发访问,为防止这种问题,我们可以通过对连接账号进行资源限制的方式解决,比如按照日常访问量加上一定冗余设置每小时查询 1w 次,那么 1 小时内超过 1w 次查询数据库就会给出资源不足的提示,而不会再分配资源进行实际查询。

设置资源限制的语法为:Alter...with option

option 的选项可以是:

MAX_QUERIES_PER_HOUR count: 每小时最大查询次数

MAX_UPDATES_PER_HOUR count: 每小时最大更新次数

MAX_COUNNECTIONS_PER_HOUR count: 每小时最大连接数

MAX_USER_CONNECTIONS count: 最大用户连接数

其中,MAX_CONNECTIOINS_PER_HOUR count 和 MAX_USER_CONNECTIONS count 的区别在于前者是每小时累计的最大连接数,而后者是瞬间的并发连接数。

六、常见问题解决与最佳实践

1. 排查与优化

  1. 诊断错误:使用 SHOW ERRORS 查找错误,使用错误代码定位问题。在 MySQL 中,当出现错误时,可以通过 SHOW ERRORS 命令来查看具体的错误信息。该命令会列出最近发生的错误,包括错误代码和错误描述。通过错误代码,可以在 MySQL 的文档或在线资源中查找对应的解决方案,从而快速定位问题所在。
  1. 性能优化:监控查询性能,使用索引提高查询效率,优化慢查询。
    • 监控查询性能:可以使用 MySQL 的性能监控工具来了解查询的执行情况。例如,可以通过 EXPLAIN 命令来查看查询的执行计划,了解 MySQL 是如何执行查询的,以及是否使用了索引等。此外,还可以使用 MySQL 的慢查询日志来记录执行时间较长的查询,以便进行分析和优化。
    • 使用索引提高查询效率:索引是提高查询效率的重要手段。在 MySQL 中,可以通过创建索引来加快数据的检索速度。例如,可以在经常用于查询的字段上创建索引,如主键、外键、唯一约束字段等。创建索引时,需要考虑索引的类型、长度和选择性等因素,以确保索引的有效性和性能。
    • 优化慢查询:对于执行时间较长的查询,可以通过优化查询语句、调整索引、增加缓存等方式来提高查询效率。例如,可以使用 JOIN 代替子查询、避免使用 SELECT * 等。此外,还可以使用 MySQL 的缓存机制来缓存查询结果,减少重复查询的开销。

2. 备份与恢复

  1. 备份:定期使用 mysqldump 或 mysqlbinlog 进行数据库备份。
    • mysqldump:是 MySQL 自带的逻辑备份工具,可以将数据库中的数据导出为 SQL 语句文件。使用 mysqldump 可以备份整个数据库、单个表或部分数据。例如,可以使用以下命令备份整个数据库:mysqldump -u username -p password database_name > backup.sql。
    • mysqlbinlog:是 MySQL 自带的二进制日志备份工具,可以记录数据库的变更操作。使用 mysqlbinlog 可以备份数据库的增量数据,以便在恢复数据时使用。例如,可以使用以下命令备份二进制日志:mysqlbinlog --no-defaults --raw --read-from-remote-server --host=remote_host --user=remote_user --password=remote_password --stop-never binary_log_file > backup.log。
  1. 恢复:通过 mysql 命令从备份文件恢复数据库。
    • 使用 source 命令:可以使用 source 命令在 MySQL 客户端中恢复数据库。例如,可以使用以下命令恢复数据库:source backup.sql。
    • 使用 mysql 命令:可以使用 mysql 命令在命令行中恢复数据库。例如,可以使用以下命令恢复数据库:mysql -u username -p password database_name < backup.sql。
    • 使用 Percona XtraBackup:是一款开源的 MySQL 热备份工具,可以在不停止数据库服务的情况下进行备份和恢复。使用 Percona XtraBackup 可以备份整个数据库、单个表或部分数据,并可以在恢复数据时进行增量恢复。例如,可以使用以下命令备份数据库:innobackupex --user=username --password=password /backup/directory。恢复数据库时,可以使用以下命令:innobackupex --apply-log /backup/directory 和 innobackupex --copy-back /backup/directory。

相关文章:

《MySQL 入门:数据库世界的第一扇门》

一、MySQL 简介 MySQL 是一种开源的关系型数据库管理系统&#xff0c;在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称&#xff0c;广泛应用于网站、企业级应用、数据分析等领域。 MySQL 具有诸多优点。首先&#xff0c;它成本低&#xff0c;作为…...

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…...

JAVA-类与继承

啥是继承&#xff1f; 在JAVA中&#xff0c; 继承就是子类继承父类的特征和行为&#xff0c;使得子类拥有父类的特征和行为&#xff0c;同时还可以拥有父类所没有的特征和行为。 举个例子通俗来讲&#xff0c;兔子和羊是食草动物类&#xff0c;狮子和豹子是食肉动物类&#x…...

SSH连接报错,Corrupted MAC on input 解决方法

问题描述 客户在windows CMD中SSH连接失败&#xff0c;报错: Corrupted MAC on input ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect值得注意的是&#xff0c;客户通过别的机器做SSH连接可以成功&#xff0c;使用putty, mo…...

【C++】8___继承

目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处&#xff1a;减少重复的代码 语法&#xff1a; class 子类 &#xff1a; 继承方式 父类 子类 也称为 派生类 父类…...

C# 中的异常处理:构建健壮和可靠的程序

C#中的异常处理&#xff08;Exception Handling&#xff09;。异常处理是编程中非常重要的一部分&#xff0c;它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理&#xff0c;可以使应用程序更加健壮、可靠&#xff0c;并提供更好的用户体验。以下…...

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...

vba学习系列(9)--按需求计数单元格数量

系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容&#xff0c;比如&#xff1a;文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...

scale index的计算

scale index定义 基本实现 需要注意&#xff0c;scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是&#xff0c;需要注意&#xff0c;经过我向作者求证。 MATLAB编写的代码已经“过时了”&#xff0c;为了拥抱时代&#xff0c;作者构建了R语言包&#xff0c;名称为…...

鸿蒙实现Web组件开发

目录&#xff1a; 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...

工业摄像头应对复杂环境的策略与解决方案

工业摄像头需应对复杂环境&#xff0c;如极端温度、振动、尘土、光照不足等。为确保稳定工作&#xff0c;它采用了先进技术和设计。详细分析如下&#xff1a; 一、增强环境适应性 采用高灵敏度传感器&#xff1a;使用CMOS或CCD图像传感器&#xff0c;适应低光照条件。 高精度、…...

重生之我在异世界学编程之C语言:深入动态内存管理篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…...

【经典论文阅读】Latent Diffusion Models(LDM)

Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机&#xff1a;在有限的计算资源下进行扩散模型训练&#xff0c;同时保持质量和灵活性 引入跨注意力层&#xff0c;以卷积方式实现对一般条件输入&#xff08;如文本或边界框…...

智能指针中的weak_ptr(弱引用智能指针)

弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c; 不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数,它的…...

【电子通识】机电继电器和固态继电器的区别

机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

如何创建对话窗口

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…...

<!DOCTYPE html>的作用是什么

一、背景 从今天开始会不定时的发布一些前端的常见面试题&#xff0c;供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明&#xff0c;它的目的就是为了告诉浏览器应该以…...

EasyExcel改名为FastExce做了那些改变呢

回到&#xff1a;github原作者地址&#xff1a;https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职&#xff0c;近期阿里宣布停止更新 EasyExcel&#xff0c;作者他本人决定继…...

狗狗的生育周期:关注与呵护

狗狗的繁殖是一个复杂且需要谨慎对待的过程&#xff0c;了解其生产周期对于宠物主人以及从事相关行业的人员至关重要。 一般而言&#xff0c;狗狗的怀孕周期约为两个月左右&#xff0c;但这并非绝对固定。从受孕到分娩&#xff0c;通常在 58 至 65 天之间波动。小型犬可能相对…...

ABAP DIALOG屏幕编程2

在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助&#xff0c;怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。 有关程序包含文件结构如下。 一、响应用户指令 如上…...

获取缓存大小与清除 Web 缓存 - 鸿蒙 HarmonyOS Next

针对浏览器 Web 组件清除缓存相关,具体实现如下 code 实例所示: /*公共方法类*/ export class PublicUtils {/*获取缓存大小*/static async getCacheSize(): Promise<number> {try {let bundleStats await storageStatistics.getCurrentBundleStats()let size bundleS…...

在Unreal Engine中,UHT与反射机制

UHT&#xff08;Unreal Header Tool&#xff09; 是虚幻引擎&#xff08;Unreal Engine&#xff09;中的一个重要工具&#xff0c;它用于处理和生成引擎所需的元数据&#xff0c;使得虚幻引擎能够执行许多复杂的功能&#xff0c;如反射、序列化、蓝图交互、垃圾回收等。简而言之…...

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节&#xff0c;尤其在涉及数据库的应用时&#xff0c;良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践&#xff0c;结合 C 与 SQL 的实际应用场景&#xff0c;涵盖项目需求收集、数据库设…...

分布式中的CAP定理和BASE理论与强弱一致性

分布式中的CAP定理和BASE理论与强弱一致性 CAP定理 CAP定理&#xff0c;也称为布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;&#xff0c;是由加州大学伯克利分校的Eric Brewer教授在2000年提出的&#xff0c;并由麻省理工学院的Seth Gilbert和Nancy Lynch于2002年正…...

C/C++常见符号与运算符

C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支&#xff1b;在 switch-case 中如 case 1:表示标签结束点&#xff1b;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同&#xff1b;switch-case中也有:…...

了解 k8s 网络基础知识

了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时&#xff0c;可以使用 --net 选项指定容器的网络模式&#xff0c;Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace&#xff0c;容器中的网络环境&#xff08;ip 地址、路…...

用户信息界面按钮禁用+发送消息功能

用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改&#xff0c;那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...

怎样给网站或者商品做推广/网站首页排名seo搜索优化

遍历文件夹中的所有子文件夹及子文件使用os.walk()方法非常简单。 语法格式大致如下&#xff1a; os.walk(top[, topdownTrue[, onerrorNone[, followlinksFalse]]]) top – 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, …...

苏州高新区建设局网站管网/360免费建站

在使用linux系统中大多都是通过文本页面输入命令来进行操作&#xff0c;linux默认的shell就是bash&#xff0c;所以我们有必要对shell进行深入了解bash特性&#xff1a;一、命令别名&#xff1a;(自定义命令)alias命令可以用来定义和显示命令的别名。但是使用alias命令定义的别…...

娄底市建设网站/网站seo招聘

以百度文库为例&#xff0c;首先找到我们要插入的参考文献&#xff0c;比如 搜索关键词&#xff0c;然后下需要的论文下面点击引用 得到 点击下面导出链接的EndNote&#xff0c;会下载一个.enw文件 找到此文件并双击打开后即已经导入到EndNote中 如果要在word中使用EndNote&…...

网站怎么加友情链接/韩国热搜榜

https://www.zhihu.com/question/26417244...

聊城做网站推广哪家好/广告优化师培训

1、针对布局加载Xml文件的优化&#xff0c;我们使用了异步Inflate的方式&#xff0c;即AsyncLayoutInflater。它的核心原理是在子线程中对我们的Layout进行加载&#xff0c;而加载完成之后会将View通过Handler发送到主线程来使用。所以不会阻塞我们的主线程&#xff0c;加载的时…...

做cpa建什么网站好/智慧软文网站

主要函数开启线程 CreateThread 需要时时获取或步骤繁琐的建议开启线程 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)调用写好的函数或者CALL, 这个可以是自定义的参数, 0, NULL); 封装调用call函数。就可以直接使用这个SendTextMessage函数 //************************…...