暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库的索引和存储过程该不该进行备份呢?来听我说

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

正文开始

 

通常情况下无需备份,但对于经过十多次交接的业务系统,因其历史状态复杂、维护链路长,做好备份尤为必要。下面我将演示主要演示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

 



END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。


文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论