目录
[1. 查看数据库信息](#1. 查看数据库信息)
[2. 切换数据库](#2. 切换数据库)
[3. 查看数据库中的表](#3. 查看数据库中的表)
[4. 查看表结构](#4. 查看表结构)
[四、SQL 语句分类](#四、SQL 语句分类)
[五、DDL 操作(数据库和表管理)](#五、DDL 操作(数据库和表管理))
[1. 数据库操作](#1. 数据库操作)
[2. 表操作](#2. 表操作)
[3. 约束管理](#3. 约束管理)
[4. 索引操作](#4. 索引操作)
[六、DML 操作(表数据管理)](#六、DML 操作(表数据管理))
[1. 插入数据(INSERT)](#1. 插入数据(INSERT))
[2. 更新数据(UPDATE)](#2. 更新数据(UPDATE))
[3. 删除数据(DELETE)](#3. 删除数据(DELETE))
[4. 合并数据(MERGE/UPSERT)](#4. 合并数据(MERGE/UPSERT))
[七、DQL 操作(数据查询)](#七、DQL 操作(数据查询))
[1. 限制查询结果数量](#1. 限制查询结果数量)
[2. 竖向显示结果](#2. 竖向显示结果)
[3. 结合使用](#3. 结合使用)
[五、忘记 root 密码处理](#五、忘记 root 密码处理)
[1. 用户授权管理基础](#1. 用户授权管理基础)
[2. 查看用户授权](#2. 查看用户授权)
[3. 撤销用户权限](#3. 撤销用户权限)
前言
MySQL作为一款成熟且广泛应用的关系型数据库管理系统,在数据存储、处理和分析领域发挥着重要作用。无论是支撑大型企业级应用,还是服务于中小型项目,其高效、稳定、灵活的特性都使其成为开发者和运维人员的首选工具之一。
在数据驱动的时代背景下,掌握MySQL的核心管理技能显得尤为关键。本内容旨在帮助读者系统性地理解MySQL的架构设计、优化策略及运维实践,涵盖从基础操作到高级调优的全流程知识体系。通过实际场景的案例解析与最佳实践的分享,期望能为数据库管理员、开发人员及相关技术人员提供实用的参考指南,助力构建高性能、高可用的数据服务架构。
一、数据库基本操作
1. 查看数据库信息
在 MySQL 或 PostgreSQL 中,查看所有数据库的列表:
sql
SHOW DATABASES; -- MySQL
\l -- PostgreSQL
2. 切换数据库
选择需要操作的数据库:
sql
USE database_name; -- MySQL
\c database_name -- PostgreSQL
3. 查看数据库中的表
列出当前数据库中的所有表:
sql
SHOW TABLES; -- MySQL
\dt -- PostgreSQL
4. 查看表结构
查看指定表的字段、数据类型、约束等信息:
sql
DESCRIBE table_name; -- MySQL
\d table_name -- PostgreSQL
或通过查询系统表(通用性更强):
sql
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_name = 'table_name';
注意:
- 命令末尾的分号(
;)在 MySQL 中必须,在 PostgreSQL 的psql命令行中可省略。 - 部分命令需在特定数据库环境下执行(如切换数据库后)。
二、常用数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| INT | 整型,用于存储整数数据,不包含小数部分。 | id INT |
| FLOAT | 单精度浮点类型,占用 4 字节内存,可以表示小数,但可能存在精度损失。 | score FLOAT |
| DOUBLE | 双精度浮点类型,占用 8 字节内存,比 FLOAT 精度更高,适合更大范围的小数。 | price DOUBLE |
| CHAR(n) | 固定长度字符类型,长度固定为 n 个字符,如果实际长度不足,会以空格填充。 | name CHAR(10) |
| VARCHAR(n) | 可变长度字符类型,最大长度限制为 n 个字符,存储时只占用实际字符的空间。 | address VARCHAR(50) |
| TEXT | 文本类型,用于存储大量文本数据,长度可变,适合长字符串。 | description TEXT |
| IMAGE | 图片类型,专门用于存储图像文件,通常以二进制形式保存。 | photo IMAGE |
| DECIMAL(p,s) | 精确数值类型,p 表示总位数(包括整数和小数部分),s 表示小数位数。适合需要高精度的数值计算。 | salary DECIMAL(5,2) |
注意:
- 对于 DECIMAL(p,s) 类型,例如 DECIMAL(5,2),p=5 表示总位数为 5(整数部分最多 3 位,小数部分固定 2 位),因此它能存储的值如 123.45,但不能存储 55555.000(因为整数部分超出了 3 位)。在实际应用中,请根据数据范围合理选择 p 和 s。
- 这些数据类型在 SQL 数据库、编程语言(如 Python 或 Java)中广泛使用。选择类型时,需考虑数据大小、精度需求和存储优化。
三、数据库文件存储结构
MySQL 数据目录: /usr/local/mysql/data
每个数据库对应一个子目录,每个表对应若干文件:
MyISAM :
.frm (表结构)、 .MYD (数据)、 .MYI (索引)
InnoDB :
独享表空间: .ibd 文件(每表一个文件)
共享表空间: ibdata 文件(多个表共用)
四、SQL****语句分类
| 类别 | 核心命令 | 功能描述 | 典型示例 |
|---|---|---|---|
| 数据定义语言 (DDL) | CREATE, ALTER, DROP, TRUNCATE, RENAME |
用于定义、修改或删除数据库对象(如表、索引、视图、存储过程等)的结构。 | CREATE TABLE Students (id INT, name VARCHAR(50)); |
| 数据操作语言 (DML) | SELECT, INSERT, UPDATE, DELETE, MERGE |
用于对数据库中的数据进行查询、插入、更新和删除操作。 | SELECT * FROM Students WHERE grade > 90; |
| 数据控制语言 (DCL) | GRANT, REVOKE |
用于管理数据库用户的访问权限和安全性控制。 | GRANT SELECT ON Students TO user1; |
| 事务控制语言 (TCL) | COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION |
用于管理数据库事务,确保数据操作的原子性和一致性。 | COMMIT;(提交事务)<br>ROLLBACK;(回滚事务) |
说明:
- DDL 操作通常会自动提交事务,不可回滚。
- DML 是日常使用最频繁的语句,尤其是
SELECT和INSERT/UPDATE/DELETE。 - TCL 在需要保证数据一致性的业务场景中至关重要。
五、DDL****操作(数据库和表管理)
1. 数据库操作
创建数据库
sql
CREATE DATABASE db_name;
删除数据库
sql
DROP DATABASE db_name;
修改数据库字符集
sql
ALTER DATABASE db_name CHARACTER SET utf8mb4;
2. 表操作
创建表
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
删除表
sql
DROP TABLE users;
修改表结构
-
添加字段
sqlALTER TABLE users ADD COLUMN age INT; -
修改字段类型
sql
ALTER TABLE users MODIFY COLUMN email VARCHAR(150);
删除字段
sql
ALTER TABLE users DROP COLUMN age;
重命名字段
sql
ALTER TABLE users RENAME COLUMN email TO user_email;
重命名表
sql
ALTER TABLE users RENAME TO customers;
3. 约束管理
添加主键
sql
ALTER TABLE orders ADD PRIMARY KEY (order_id);
添加外键
sql
ALTER TABLE orders
ADD CONSTRAINT fk_user_id
FOREIGN KEY (user_id) REFERENCES users(id);
删除约束
sql
ALTER TABLE orders DROP CONSTRAINT fk_user_id;
4. 索引操作
创建索引
sql
CREATE INDEX idx_name ON users (name);
删除索引
sql
DROP INDEX idx_name ON users;
六、DML****操作(表数据管理)
1. 插入数据(INSERT)
向表中添加新记录:
sql
INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);
示例 :向students表插入数据
sql
INSERT INTO students (id, name, age)
VALUES (101, '张三', 20);
2. 更新数据(UPDATE)
修改现有记录:
sql
UPDATE 表名
SET 列1=新值1, 列2=新值2, ...
WHERE 条件;
注意 :WHERE子句避免全表更新
示例 :将id=101的学生年龄改为21
sql
UPDATE students
SET age = 21
WHERE id = 101;
3. 删除数据(DELETE)
移除符合条件的记录:
sql
DELETE FROM 表名
WHERE 条件;
示例 :删除age>25的学生
sql
DELETE FROM students
WHERE age > 25;
4. 合并数据(MERGE/UPSERT)
根据条件插入或更新(SQL方言差异):
sql
MERGE INTO 目标表 USING 源表
ON (匹配条件)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;
关键要点
- 事务控制 :DML操作需通过
COMMIT提交或ROLLBACK回滚 - 条件精准 :
WHERE子句缺失可能导致全表误操作 - 性能影响:批量操作时建议使用事务分批提交
七、DQL****操作(数据查询)
1. 限制查询结果数量
在数据查询语言中,通常使用 LIMIT 子句来限制返回的记录数。语法格式如下:
sql
SELECT 字段1, 字段2
FROM 表名
WHERE 条件
LIMIT 数量;
示例:返回前 5 条记录
sql
SELECT *
FROM employees
LIMIT 5;
2. 竖向显示结果
在命令行工具中(如 MySQL),可通过在查询语句末尾添加 \G 替代分号 ; 实现竖向格式化输出:
sql
SELECT *
FROM employees
WHERE department_id = 10
LIMIT 3 \G
输出效果:
markdown
*************************** 1. row ***************************
id: 1001
name: 张三
department: 技术部
*************************** 2. row ***************************
id: 1002
name: 李四
department: 技术部
3. 结合使用
同时实现结果限制与竖向显示:
sql
SELECT id, name, salary
FROM employees
WHERE salary > 5000
LIMIT 2 \G
注意事项
LIMIT子句在不同数据库中的语法可能略有差异(例如 SQL Server 使用TOP)- 竖向显示功能 (
\G) 主要在 MySQL 命令行客户端中有效 - 在可视化工具(如 Navicat)中结果通常以表格形式展示
八、用户管理
一、创建用户
通过命令行工具创建新用户,需设置用户名和初始密码
bash
sudo useradd -m username # 创建用户并生成家目录
sudo passwd username # 设置密码
二、查看用户
-
列出所有用户
bashcut -d: -f1 /etc/passwd -
查看用户详细信息
bashid username # 查看用户ID及组信息 finger username # 查看登录信息(需安装finger包)三、删除用户
删除用户并清理关联文件:
bashsudo userdel -r username # -r参数同时删除家目录和邮件
四、修改密码
-
当前用户自主修改
bashpasswd # 按提示输入新旧密码 -
管理员修改其他用户密码
bashsudo passwd username
五、忘记 root 密码处理
通过引导菜单进入单用户模式重置:
-
重启系统,在GRUB菜单按
e编辑启动项 -
找到
linux行,在行尾添加init=/bin/bash -
按
Ctrl+X启动进入bash -
执行挂载和密码重置:
bashmount -o remount,rw / passwd root # 设置新密码 exec /sbin/init # 正常重启注意事项
-
所有敏感操作需
sudo提权 -
删除用户前确认数据备份
-
root密码重置后立即恢复SELinux状态(如启用)
九、用户授权管理
1. 用户授权管理基础
用户授权管理通常涉及三个核心实体:
- 用户(User):系统的使用者。
- 权限(Permission):用户可以在系统内执行的具体操作或访问的资源。
- 角色(Role):权限的集合。用户可以被赋予角色,从而间接获得该角色包含的所有权限(可选,但常见)。
授权管理的关键在于记录 用户与权限/角色的关联关系。
2. 查看用户授权
要查看某个用户当前拥有的权限,通常需要查询存储授权关系的表(如 user_permission 或 user_role)。
数据库设计示例 (简化版)
sql
-- 用户表
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE
);
-- 权限表
CREATE TABLE permissions (
permission_id INT PRIMARY KEY AUTO_INCREMENT,
permission_name VARCHAR(50) NOT NULL UNIQUE, -- 例如 'view_dashboard', 'edit_post'
description VARCHAR(255)
);
-- 用户-权限关联表 (直接授权)
CREATE TABLE user_permissions (
user_id INT,
permission_id INT,
PRIMARY KEY (user_id, permission_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (permission_id) REFERENCES permissions(permission_id)
);
查询用户权限示例 (SQL)
-
查看用户
user123拥有的所有权限:sqlSELECT p.permission_name, p.description FROM users u JOIN user_permissions up ON u.user_id = up.user_id JOIN permissions p ON up.permission_id = p.permission_id WHERE u.username = 'user123';检查用户
user123是否拥有特定权限edit_post:sqlSELECT COUNT(*) FROM user_permissions up JOIN users u ON up.user_id = u.user_id JOIN permissions p ON up.permission_id = p.permission_id WHERE u.username = 'user123' AND p.permission_name = 'edit_post'; -
(结果大于 0 表示拥有该权限)
3. 撤销用户权限
撤销权限意味着移除用户与特定权限之间的关联关系。这通常通过从关联表中删除对应的记录来实现。
撤销权限操作示例 (SQL)
-
撤销用户
user123的edit_post权限:sqlDELETE up FROM user_permissions up JOIN users u ON up.user_id = u.user_id JOIN permissions p ON up.permission_id = p.permission_id WHERE u.username = 'user123' AND p.permission_name = 'edit_post';撤销权限操作示例 (Python)
pythondef revoke_permission(username, permission_name): # 连接数据库 (假设使用类似mysql-connector的库) db = get_db_connection() cursor = db.cursor() try: # 先查询用户ID和权限ID (防止SQL注入) cursor.execute("SELECT user_id FROM users WHERE username = %s", (username,)) user_id_result = cursor.fetchone() if not user_id_result: print(f"用户 {username} 不存在") return False user_id = user_id_result[0] cursor.execute("SELECT permission_id FROM permissions WHERE permission_name = %s", (permission_name,)) permission_id_result = cursor.fetchone() if not permission_id_result: print(f"权限 {permission_name} 不存在") return False permission_id = permission_id_result[0] # 执行删除操作 (撤销授权) cursor.execute("DELETE FROM user_permissions WHERE user_id = %s AND permission_id = %s", (user_id, permission_id)) # 检查是否成功删除了记录 if cursor.rowcount > 0: print(f"成功撤销用户 {username} 的 {permission_name} 权限") db.commit() return True else: print(f"用户 {username} 原本就没有 {permission_name} 权限") return False except Exception as e: print(f"撤销权限时出错: {e}") db.rollback() return False finally: cursor.close() db.close()关键注意事项
-
事务性 :撤销权限的数据库操作应该在一个事务中完成,以确保数据一致性(如上面的Python示例使用了
commit和rollback)。 -
验证存在性:在执行删除操作前,务必验证用户和权限是否存在,避免无效操作。
-
日志记录:重要的权限变更(尤其是撤销)应该记录操作日志,包括操作者、被操作者、权限、时间等信息,便于审计。
-
级联影响:如果系统使用角色管理,撤销角色成员资格可能等同于撤销该角色包含的所有权限。撤销直接授予的权限不会影响通过角色间接获得的权限。
-
即时生效:权限撤销后,系统应确保该用户后续操作不再拥有该权限。这可能需要用户的会话失效(强制重新登录)或应用程序权限检查逻辑的实时生效。
4.权限说明
| 权限名称 | 功能描述 |
|---|---|
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 修改数据 |
| DELETE | 删除数据 |
| CREATE | 创建数据库/表 |
| DROP | 删除数据库/表 |
| INDEX | 建立索引 |
| ALTER | 修改表结构 |
| EXECUTE | 执行存储过程 |
| CREATE VIEW | 创建视图 |
| SHOW VIEW | 查看视图 |
| CREATE ROUTINE | 创建存储过程 |
| ALTER ROUTINE | 修改存储过程 |
| EVENT | 创建事件 |
| TRIGGER | 创建触发器 |
| ALL PRIVILEGES | 所有权限 |
总结
综上所述,MySQL数据库管理不仅涉及基础的安装配置、数据操作,更需深入理解索引优化、事务控制、备份恢复等核心机制。高效的数据库运维要求管理员具备全局视角,能够结合业务需求合理设计表结构、编写高性能SQL语句,并通过监控工具实时诊断系统状态。
持续学习MySQL的新特性(如窗口函数、JSON支持等)并关注安全策略(如权限管理、加密传输),是保障数据服务稳定运行的关键。通过系统化的学习和实践,读者可逐步构建起完整的MySQL管理能力体系,为业务系统提供坚实可靠的数据支撑。