MySQL学习知识点(四)

简介: 教程来源 https://app-ad5sxofh8phd.appmiaoda.com 详解MySQL高级功能:视图(简化查询、保障安全)、临时表(会话级暂存);用户权限管理(创建/授权/角色控制);备份恢复策略(逻辑/物理/二进制日志/表空间传输),全面提升数据管理与运维能力。

十、视图与临时表

10.1 视图

-- 创建视图
CREATE VIEW user_orders AS
SELECT u.id, u.name, u.email, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, u.email;

-- 使用视图
SELECT * FROM user_orders WHERE total_amount > 1000;

-- 可更新视图(满足条件时可更新)
CREATE VIEW active_users AS
SELECT id, name, email, age FROM users WHERE status = 'active';

-- 检查视图
CHECK TABLE active_users;

-- 查看视图定义
SHOW CREATE VIEW user_orders;

-- 修改视图
CREATE OR REPLACE VIEW user_orders AS
SELECT u.id, u.name, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name, u.email;

-- 删除视图
DROP VIEW IF EXISTS user_orders;

-- 视图优点
-- 1. 简化复杂查询
-- 2. 数据安全(隐藏敏感字段)
-- 3. 逻辑数据独立性

10.2 临时表

-- 创建临时表
CREATE TEMPORARY TABLE temp_user_stats (
    user_id INT,
    order_count INT,
    total_amount DECIMAL(10,2)
);

-- 插入数据
INSERT INTO temp_user_stats
SELECT user_id, COUNT(*), SUM(amount)
FROM orders
GROUP BY user_id;

-- 使用临时表
SELECT * FROM temp_user_stats WHERE order_count > 5;

-- 连接查询中使用临时表
SELECT u.name, t.order_count
FROM users u
INNER JOIN temp_user_stats t ON u.id = t.user_id;

-- 临时表特点
-- 1. 只在当前会话可见
-- 2. 会话结束自动删除
-- 3. 可以创建索引
CREATE TEMPORARY TABLE temp_data (id INT, name VARCHAR(50));
CREATE INDEX idx_temp_id ON temp_data(id);

-- 内存临时表
CREATE TEMPORARY TABLE temp_memory (
    id INT,
    value VARCHAR(100)
) ENGINE=MEMORY;

十一、用户与权限管理

11.1 用户管理

-- 创建用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'password';
CREATE USER 'web_user'@'%' IDENTIFIED BY 'web_pass';

-- 修改用户密码
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'new_password';
SET PASSWORD FOR 'app_user'@'localhost' = PASSWORD('new_password');

-- 删除用户
DROP USER 'app_user'@'localhost';

-- 查看所有用户
SELECT user, host FROM mysql.user;

-- 重命名用户
RENAME USER 'old_user'@'localhost' TO 'new_user'@'localhost';

11.2 权限管理

-- 授予权限
-- 所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost';

-- 指定权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.users TO 'app_user'@'localhost';

-- 数据库级别权限
GRANT CREATE, ALTER, DROP ON mydb.* TO 'admin'@'localhost';

-- 全局权限
GRANT SUPER, PROCESS ON *.* TO 'dba'@'localhost';

-- 授予权限并允许传递
GRANT SELECT ON mydb.* TO 'read_user'@'localhost' WITH GRANT OPTION;

-- 查看权限
SHOW GRANTS FOR 'app_user'@'localhost';
SHOW GRANTS FOR CURRENT_USER();

-- 撤销权限
REVOKE INSERT, UPDATE ON mydb.users FROM 'app_user'@'localhost';
REVOKE ALL PRIVILEGES ON mydb.* FROM 'app_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

11.3 角色管理(MySQL 8.0+)

-- 创建角色
CREATE ROLE 'app_read';
CREATE ROLE 'app_write';
CREATE ROLE 'app_admin';

-- 授予角色权限
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_admin';

-- 授予用户角色
GRANT 'app_read' TO 'user1'@'localhost';
GRANT 'app_write' TO 'user2'@'localhost';
GRANT 'app_admin' TO 'admin'@'localhost';

-- 设置默认角色
SET DEFAULT ROLE 'app_read' TO 'user1'@'localhost';

-- 激活角色
SET ROLE 'app_read';

-- 查看角色
SELECT * FROM mysql.role_edges;

十二、备份与恢复

12.1 逻辑备份(mysqldump)

# 备份单个数据库
mysqldump -u root -p mydb > mydb_backup.sql

# 备份多个数据库
mysqldump -u root -p --databases db1 db2 > dbs_backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_dbs.sql

# 备份特定表
mysqldump -u root -p mydb users orders > users_orders.sql

# 只备份结构(无数据)
mysqldump -u root -p --no-data mydb > mydb_structure.sql

# 只备份数据(无结构)
mysqldump -u root -p --no-create-info mydb > mydb_data.sql

# 备份时包含存储过程、函数、触发器
mysqldump -u root -p --routines --triggers mydb > mydb_full.sql

# 条件备份(使用 WHERE)
mysqldump -u root -p mydb users --where="age > 18" > adult_users.sql

# 恢复备份
mysql -u root -p mydb < mydb_backup.sql

# 恢复时创建数据库
mysql -u root -p < all_dbs.sql

12.2 物理备份

-- 冷备份(停止服务)
sudo systemctl stop mysql
cp -r /var/lib/mysql /backup/mysql_backup
sudo systemctl start mysql

-- 热备份(使用 Percona XtraBackup)
# 安装 Percona XtraBackup
# 全量备份
xtrabackup --backup --target-dir=/backup/full

# 增量备份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full

# 准备恢复
xtrabackup --prepare --target-dir=/backup/full

# 恢复
xtrabackup --copy-back --target-dir=/backup/full

12.3 二进制日志恢复

-- 查看二进制日志状态
SHOW VARIABLES LIKE 'log_bin';
SHOW BINARY LOGS;

-- 查看二进制日志内容
SHOW BINLOG EVENTS IN 'mysql-bin.000001';

-- 根据时间点恢复
mysqlbinlog --start-datetime="2024-01-01 10:00:00" --stop-datetime="2024-01-01 12:00:00" mysql-bin.000001 | mysql -u root -p

-- 根据位置恢复
mysqlbinlog --start-position=100 --stop-position=500 mysql-bin.000001 | mysql -u root -p

12.4 表空间传输(MySQL 8.0+)

-- 导出表空间
FLUSH TABLES users FOR EXPORT;
-- 复制 .ibd 和 .cfg 文件
UNLOCK TABLES;

-- 导入表空间
CREATE TABLE users (...) ENGINE=InnoDB;
ALTER TABLE users DISCARD TABLESPACE;
-- 复制 .ibd 文件
ALTER TABLE users IMPORT TABLESPACE;

来源:
https://app-ad5sxofh8phd.appmiaoda.com

相关文章
|
4月前
|
SQL Java 关系型数据库
MyBatis 动态 SQL 详解:灵活构建复杂查询条件
MyBatis提供强大的动态SQL机制,通过`&lt;if&gt;`、`&lt;where&gt;`、`&lt;foreach&gt;`等标签实现条件判断、循环拼接,避免手动字符串处理。支持智能WHERE、SET生成,兼容多数据库模糊查询,提升代码安全性与可维护性,适用于复杂查询、批量操作等场景。
|
JavaScript 前端开发
如何处理 Vue 中的异步操作和 Promise?
如何处理 Vue 中的异步操作和 Promise?
315 1
|
17天前
|
JavaScript 前端开发 API
VUE前端初级新手知识大全(一)
教程来源 https://app-a6nw7st4g741.appmiaoda.com/ Vue.js是轻量、易上手的渐进式前端框架,专注视图层,支持声明式编程与MVVM模式。本文系统讲解入门知识:从CDN/CLI环境搭建、核心语法(插值、指令、ref/reactive)、响应式原理,到计算属性与侦听器,助你快速构建首个Vue应用。
|
4月前
|
安全 Java API
Java日期处理完全指南(新手也能轻松掌握的Java时间格式化与日期API教程)
教程来源https://www.vpshk.cn/本文介绍Java 8引入的java.time包,详解LocalDateTime、LocalDate等类的使用,涵盖获取当前时间、格式化、解析字符串及日期运算,助你轻松掌握现代Java日期处理方法,适合初学者快速上手。
|
Java 网络安全 开发者
SpringBoot之如何正确获取配置文件中的值?
SpringBoot之如何正确获取配置文件中的值?
392 0
|
11天前
|
XML Java Maven
Spring Boot学习知识点大全(一)
教程来源 https://app-a87ujc988w01.appmiaoda.com/ Spring Boot 是 Spring 家族中革命性框架,秉持“约定优于配置”理念,通过自动配置、起步依赖、嵌入式服务器等特性,大幅简化企业级 Java 应用开发。本文系统梳理其核心概念、注解、多环境配置与最佳实践,助初学者快速入门,为进阶开发者提供深度参考。
|
存储 消息中间件 JavaScript
vue组件传值的12种方式
【10月更文挑战第1天】
1414 159
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
791 2
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
小程序
Taro@3.x+Vue@3.x+TS开发微信小程序,上传文件
本文介绍如何在Taro项目中使用Nut UI的`&lt;nut-uploader/&gt;`组件实现图片上传功能,并通过示例代码展示了自定义上传逻辑的方法。
771 0
Taro@3.x+Vue@3.x+TS开发微信小程序,上传文件
|
前端开发 JavaScript
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
661 1

热门文章

最新文章