当前位置:首页 > 问答 > 正文

plsql备份数据库到底怎么弄,步骤和方法能不能简单说说

数据泵(Data Pump)是关键

你想备份数据库,本质上就是把数据库里的数据(比如表、视图、存储过程等)弄出来,存成一个个文件,万一数据库出问题了,再用这些文件把数据恢复回去,Oracle的数据泵就是干这个的,它有两个主要命令:expdp(导出数据)和impdp(导入数据),我们说的备份,主要就是用expdp

expdp命令通常是在操作系统的命令行里敲的,比如在Linux上或者Windows的CMD里,那怎么跟PL/SQL扯上关系呢?关系就在于,Oracle提供了一个叫做DBMS_SCHEDULER的PL/SQL包,你可以写一段PL/SQL代码,告诉数据库:“去,帮我执行一下那个expdp的命令。”这样,备份任务就可以在数据库内部被安排和执行了。

用PL/SQL调度数据泵备份的详细步骤

这个方法的核心是“用PL/SQL调用外部程序”,我们一步一步来。

第一步:创建一个目录对象

数据库服务器上的文件是放在文件夹里的,但数据库不能直接操作服务器的文件夹,它需要一个“目录对象”来对应那个文件夹,这个目录对象就是数据库里的一個指向,告诉数据库备份文件要放在服务器的哪个地方。

你得先用有权限的账号(比如SYS或SYSTEM)登录数据库,然后执行类似的PL/SQL命令:

CREATE OR REPLACE DIRECTORY backup_dir AS '/home/oracle/backups';

这里,backup_dir是你在数据库里给这个目录起的名字,可以随便取,但要有意义。/home/oracle/backups是服务器上真实存在的文件夹路径,你必须保证Oracle软件的用户(比如oracle用户)有权限在这个文件夹里读写文件。

第二步:编写一个参数文件(Parfile)

直接在PL/SQL里写一长串expdp命令会很麻烦,所以最好把备份的参数写在一个单独的文本文件里,这个文件也放在服务器上。

你创建一个叫my_backup.par的文件,内容大概是这样的:

userid=你的用户名/你的密码
directory=backup_dir
dumpfile=full_backup_%U.dmp
logfile=full_backup.log
full=y
compression=all

解释一下这几个参数:

  • userid:用哪个数据库用户来执行备份,需要足够的权限。
  • directory:就用第一步创建的目录对象名backup_dir
  • dumpfile:备份出来的文件叫什么名字。%U是个占位符,表示如果文件太大,会自动分成多个文件,比如full_backup_01.dmp, full_backup_02.dmp
  • logfile:备份过程的日志写到哪里。
  • full=y:表示备份整个数据库,如果你只想备份某个用户(模式)的数据,就换成schemas=用户名
  • compression=all:压缩一下备份文件,节省空间。

第三步:编写PL/SQL程序来调用数据泵

现在主角登场了,我们要用DBMS_SCHEDULER包来创建一个作业(Job),这个作业的内容就是去调用操作系统的expdp命令。

示例PL/SQL代码看起来是这样的:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'MY_BACKUP_JOB',
    job_type        => 'EXECUTABLE',
    job_action      => '/bin/bash',  -- 对于Linux/Unix系统
    number_of_arguments => 2,
    start_date      => SYSTIMESTAMP,
    enabled         => FALSE,
    auto_drop       => FALSE
  );
  -- 告诉这个作业,调用bash时要执行什么命令
  DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('MY_BACKUP_JOB', 1, '-c');
  DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('MY_BACKUP_JOB', 2, 'expdp parfile=/home/oracle/scripts/my_backup.par');
  -- 启用这个作业,让它开始运行
  DBMS_SCHEDULER.ENABLE('MY_BACKUP_JOB');
END;
/

这段代码的意思是:

  1. 创建一个名叫MY_BACKUP_JOB的作业。
  2. 这个作业的类型是“可执行文件”,也就是直接运行系统命令,这里我们运行的是/bin/bash(Linux的shell)。
  3. 然后我们给这个bash传了两个参数:第一个是-c,表示后面跟的是要执行的命令字符串;第二个就是完整的expdp命令,并且指定了使用我们刚写好的那个参数文件my_backup.par
  4. 启用这个作业,它就会立刻开始执行备份。

第四步:管理备份作业

作业创建好后,你可以通过PL/SQL来查看它的运行状态:

SELECT job_name, state, log_date FROM USER_SCHEDULER_JOB_LOG WHERE job_name = 'MY_BACKUP_JOB';

如果你想让它定时自动执行,比如每天凌晨2点备份一次,可以在CREATE_JOB的时候加上repeat_interval参数, repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0'

一个更简单但功能受限的方法:用PL/SQL直接导出小批量数据

如果你的目的不是备份整个数据库或整个用户,而只是紧急导出几张重要的表,而且数据量不大,还有一种更“纯”的PL/SQL方法,就是使用UTL_FILE包和游标(Cursor),自己写循环语句,把表里的数据查出来,然后按照CSV或者其他格式写入文件。

这种方法非常麻烦,效率也低,不适合大规模备份,大概思路是:

  1. UTL_FILE.FOPEN在第一步创建的目录对象里打开一个文件。
  2. 用游标逐行读取表数据。
  3. UTL_FILE.PUT_LINE把每一行数据写成文本写入文件。
  4. 循环结束后关闭文件和游标。

这基本上等于自己重新发明了一个简陋的导出工具,除非有特别需求,否则不推荐用于正经的备份。

所谓的“PL/SQL备份数据库”,最实用、最接近生产环境的方法,就是利用PL/SQL的DBMS_SCHEDULER包,来调度和执行Oracle官方的数据泵工具(expdp),这样做既利用了PL/SQL在数据库内部调度的便利性,又享受了数据泵强大、高效的备份能力,步骤就是:创建目录对象 -> 准备参数文件 -> 写PL/SQL作业调用expdp -> 管理和监控作业。

备份非常重要,但更重要的是定期测试恢复,你一定要确保在另一台机器上或用另一个数据库,能用你备份出来的DMP文件成功地把数据恢复回来,否则备份就失去了意义。

plsql备份数据库到底怎么弄,步骤和方法能不能简单说说