热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多提宝贵地意见,我们一起提升,守住自己的饭碗。
正文开始
通常情况下无需备份,但对于经过十多次交接的业务系统,因其历史状态复杂、维护链路长,做好备份尤为必要。下面我将演示主要演示MySQL 数据库中如何查询索引、存储过程,以及备份与恢复的具体操作。
一、如何查询数据库的索引和存储过程?
(一)索引
1、查看指定表的所有索引
如果你想查看某个表(例如 e 表)的所有索引,可以使用以下 SQL:
SELECT
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
NON_UNIQUE,
INDEX_TYPE
FROM
information_schema.STATISTICS
WHERE
TABLE_SCHEMA = DATABASE() -- 当前数据库
AND TABLE_NAME = 'e'; -- 指定表名

2、查看数据库中所有表的索引
若要查看当前数据库中所有表的索引信息,使用:
SELECT
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
NON_UNIQUE,
INDEX_TYPE
FROM
information_schema.STATISTICS
WHERE
TABLE_SCHEMA = DATABASE();

3、查看所有数据库的所有索引
如需查看所有数据库中的索引(需要足够权限),则去掉 TABLE_SCHEMA 过滤条件:
SELECT
TABLE_SCHEMA,
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
NON_UNIQUE,
INDEX_TYPE
FROM
information_schema.STATISTICS;

(二)存储过程
1、查看当前数据库的所有存储过程
SELECT
ROUTINE_NAME,
ROUTINE_TYPE,
CREATED,
LAST_ALTERED,
ROUTINE_BODY
FROM
information_schema.ROUTINES
WHERE
ROUTINE_SCHEMA = DATABASE() -- 当前数据库
AND ROUTINE_TYPE = 'PROCEDURE'; -- 仅存储过程

2、查看指定存储过程的定义
如果你想查看某个存储过程(例如 sp_upsert_e)的详细定义,可以使用:
SHOW CREATE PROCEDURE sp_upsert_e;

3、查看所有数据库的存储过程
若要查看所有数据库中的存储过程(需要足够权限),则去掉 ROUTINE_SCHEMA 过滤条件:
SELECT
ROUTINE_SCHEMA, -- 数据库名
ROUTINE_NAME,
ROUTINE_TYPE,
CREATED,
LAST_ALTERED
FROM
information_schema.ROUTINES
WHERE
ROUTINE_TYPE = 'PROCEDURE';

二、备份索引和存储过程
1. 仅备份索引(表结构)
使用 --no-data 参数可以只导出表结构(包括索引),不包含数据:
mysqldump --no-data -u [用户名] -p [数据库名] > 结构备份.sql
关键参数说明:
--no-data:只导出表结构,不包含数据。
--skip-triggers:(可选)如果不需要触发器,可添加此参数。
2. 仅备份存储过程和函数
使用 --no-create-info、--no-data 和 --routines 参数组合:
mysqldump --no-create-info --no-data --routines -u [用户名] -p [数据库名] > 存储过程备份.sql
关键参数说明:
--no-create-info:不导出表结构,只保留数据和存储过程。
--no-data:不导出表数据。
--routines:导出存储过程和函数。
--triggers:(可选)如果需要同时备份触发器,添加此参数。
3. 仅备份特定存储过程
如果只需备份某个存储过程(例如 sp_upsert_e),可以结合 --no-create-info 和 --where 参数:
mysqldump --no-create-info --no-data --routines -u [用户名] -p [数据库名] \
--where="ROUTINE_NAME = 'sp_upsert_e'" information_schema.ROUTINES > 特定存储过程备份.sql
4.同时备份表结构(含索引)和存储过程
mysqldump --no-data --routines -u [用户名] -p [数据库名] > 结构+存储过程备份.sql
示例:
[root@localhost ~]# mysqldump --no-data --single-transaction --routines -u root -p test > 1.sql
三、恢复索引和存储过程
[root@localhost ~]# mysql -u root -p test < 1.sql
Oracle数据库:
一、查看索引
1. 查看所有索引
查询 USER_INDEXES
视图(当前用户的索引):
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS
FROM USER_INDEXES;
查询 ALL_INDEXES
视图(所有可访问的索引):
SELECT INDEX_NAME, TABLE_OWNER, TABLE_NAME, UNIQUENESS
FROM ALL_INDEXES;
2. 查看索引详情
查询 USER_IND_COLUMNS
视图获取索引包含的列:
SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE'; -- 表名
二、查看存储过程
1. 查看所有存储过程
查询 USER_PROCEDURES
视图(当前用户的存储过程):
SELECT OBJECT_NAME, STATUS
FROM USER_PROCEDURES
WHERE OBJECT_TYPE = 'PROCEDURE';
2. 查看存储过程代码
使用 DBMS_METADATA.GET_DDL
函数获取完整代码:
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'PROC_NAME')
FROM DUAL;
• PROC_NAME
是存储过程名称,需大写(Oracle 默认对象名大写,除非创建时用双引号引住)。
在 Oracle 中,可以使用 数据泵(Data Pump) 工具(expdp
/impdp
)仅导出索引和存储过程而不包含数据。以下是具体方法:
三、仅导出索引和存储过程(不包含数据)
使用 expdp
命令时,通过 CONTENT=METADATA_ONLY
参数排除数据,结合 INCLUDE
子句指定只导出索引和存储过程:
expdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=metadata.dmp \
LOGFILE=expdp.log \
CONTENT=METADATA_ONLY \
INCLUDE=INDEX \
INCLUDE=PROCEDURE
参数说明:
• CONTENT=METADATA_ONLY
:只导出元数据(结构),不包含数据。• INCLUDE=INDEX
:包含索引定义。• INCLUDE=PROCEDURE
:包含存储过程定义。• DIRECTORY=dump_dir
:需提前创建目录对象(如CREATE OR REPLACE DIRECTORY dump_dir AS '/u01/backup';
)。
四、细化控制:只导出特定对象
1. 导出指定存储过程
使用 INCLUDE=PROCEDURE:"IN ('PROC_NAME1', 'PROC_NAME2')"
:
expdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=procs.dmp \
CONTENT=METADATA_ONLY \
INCLUDE=PROCEDURE:"IN ('GET_EMPLOYEE', 'CALC_BONUS')"
2. 导出指定表的索引
结合 TABLES
参数和 INCLUDE=INDEX
:
expdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=tables_idx.dmp \
CONTENT=METADATA_ONLY \
TABLES=EMPLOYEE,DEPARTMENT \
INCLUDE=INDEX
五、导入(恢复)方法
使用 impdp
命令恢复元数据:
impdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=metadata.dmp \
LOGFILE=impdp.log \
CONTENT=METADATA_ONLY
六、其他常用场景
1. 同时导出存储过程、函数和包
expdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=code.dmp \
CONTENT=METADATA_ONLY \
INCLUDE=PROCEDURE \
INCLUDE=FUNCTION \
INCLUDE=PACKAGE
2. 排除特定类型(如触发器)
expdp system/password@SID \
DIRECTORY=dump_dir \
DUMPFILE=metadata.dmp \
CONTENT=METADATA_ONLY \
INCLUDE=INDEX,PROCEDURE \
EXCLUDE=TRIGGER
文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。




