MySQL 数据库管理

目录

前言

一、数据库基本操作

[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. 查看用户授权)

数据库设计示例 (简化版)

查询用户权限示例 (SQL)

[3. 撤销用户权限](#3. 撤销用户权限)

撤销权限操作示例 (SQL)

关键注意事项

4.权限说明

总结


前言

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';
 

注意

  1. 命令末尾的分号(;)在 MySQL 中必须,在 PostgreSQL 的 psql 命令行中可省略。
  2. 部分命令需在特定数据库环境下执行(如切换数据库后)。

二、常用数据类型

类型 说明 示例
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;(回滚事务)

说明

  1. DDL 操作通常会自动提交事务,不可回滚。
  2. DML 是日常使用最频繁的语句,尤其是 SELECTINSERT/UPDATE/DELETE
  3. 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;
 
修改表结构
  • 添加字段

    sql 复制代码
    ALTER 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 ...;
 

关键要点

  1. 事务控制 :DML操作需通过COMMIT提交或ROLLBACK回滚
  2. 条件精准WHERE子句缺失可能导致全表误操作
  3. 性能影响:批量操作时建议使用事务分批提交

七、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
 

注意事项

  1. LIMIT 子句在不同数据库中的语法可能略有差异(例如 SQL Server 使用 TOP
  2. 竖向显示功能 (\G) 主要在 MySQL 命令行客户端中有效
  3. 在可视化工具(如 Navicat)中结果通常以表格形式展示

八、用户管理

一、创建用户

通过命令行工具创建新用户,需设置用户名和初始密码

bash 复制代码
sudo useradd -m username  # 创建用户并生成家目录
sudo passwd username      # 设置密码
 

二、查看用户

  1. 列出所有用户

    bash 复制代码
    cut -d: -f1 /etc/passwd
     
  2. 查看用户详细信息

    bash 复制代码
    id username  # 查看用户ID及组信息
    finger username  # 查看登录信息(需安装finger包)
     

    三、删除用户

    删除用户并清理关联文件:

    bash 复制代码
    sudo userdel -r username  # -r参数同时删除家目录和邮件
     

四、修改密码

  1. 当前用户自主修改

    bash 复制代码
    passwd  # 按提示输入新旧密码
     
  2. 管理员修改其他用户密码

    bash 复制代码
    sudo passwd username
     

五、忘记 root 密码处理

通过引导菜单进入单用户模式重置:

  1. 重启系统,在GRUB菜单按e编辑启动项

  2. 找到linux行,在行尾添加 init=/bin/bash

  3. Ctrl+X启动进入bash

  4. 执行挂载和密码重置:

    bash 复制代码
    mount -o remount,rw /
    passwd root  # 设置新密码
    exec /sbin/init  # 正常重启
     

    注意事项

  5. 所有敏感操作需sudo提权

  6. 删除用户前确认数据备份

  7. root密码重置后立即恢复SELinux状态(如启用)

九、用户授权管理

1. 用户授权管理基础

用户授权管理通常涉及三个核心实体:

  • 用户(User):系统的使用者。
  • 权限(Permission):用户可以在系统内执行的具体操作或访问的资源。
  • 角色(Role):权限的集合。用户可以被赋予角色,从而间接获得该角色包含的所有权限(可选,但常见)。

授权管理的关键在于记录 用户与权限/角色的关联关系


2. 查看用户授权

要查看某个用户当前拥有的权限,通常需要查询存储授权关系的表(如 user_permissionuser_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 拥有的所有权限:

    sql 复制代码
    SELECT 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

    sql 复制代码
    SELECT 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)
  • 撤销用户 user123edit_post 权限:

    sql 复制代码
    DELETE 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)

    python 复制代码
    def 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示例使用了 commitrollback)。

  • 验证存在性:在执行删除操作前,务必验证用户和权限是否存在,避免无效操作。

  • 日志记录:重要的权限变更(尤其是撤销)应该记录操作日志,包括操作者、被操作者、权限、时间等信息,便于审计。

  • 级联影响:如果系统使用角色管理,撤销角色成员资格可能等同于撤销该角色包含的所有权限。撤销直接授予的权限不会影响通过角色间接获得的权限。

  • 即时生效:权限撤销后,系统应确保该用户后续操作不再拥有该权限。这可能需要用户的会话失效(强制重新登录)或应用程序权限检查逻辑的实时生效。

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管理能力体系,为业务系统提供坚实可靠的数据支撑。

相关推荐
0xDevNull2 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花2 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希3 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿4 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴4 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存