由于误操作删除了业务表,且不知道具体的操作时间,只知道是25号删除的,现需要恢复。
找回数据需要依靠备份,归档,sql日志,这些正常备份的情况下,我们才能进行恢复。
--通过这个命令找到数据库安装实例目录
ps -ef | grep dmserver
可以看到数据库实例目录在/data/dmdata/dmdb
--进入实例目录查看归档配置中,归档日志路径
/data/dmdata/dmdb
--查看归档配置
cat dmarch.ini
--目录参数名
ARCH_DEST=/data/dmarch
--查看sqllog目录
cat sqllog.ini
--目录参数名
FILE_PATH=/data/dmdata/dmdb/sqllog
确认好位置后,到相应的位置去查看是否有正常生成日志,且删除当天的日志是否存在。
查看归档日志,25号11点生成了归档日志,我们就要留意24号到26号的归档日志是否都正常存在,后面确认好删除时间再决定用哪个归档日志。
查看备份(包括全备和增量备份)
可以通过DM管理工具连接数据库,查看备份作业,点击【作业】-【备份的作业名】=【查看历史作业信息】
我们可以看到最新的全备只有23号,
同样的,我们选择增量备份的作业,查看历史作业,是每天凌晨1点增量,最新增量是26号。
查看备份路径
双击进入查看备份目录
获取到备份目录后,到服务器上这个目录查看备份文件是否正常存在
cd /data/dmbak/dmdb
对应日期的全备和全备往后的增量备份都必须要存在。
我们进入到sqllog日志的目录
cd /data/dmdata/dmdb/sqllog
--查找25号的所有sql日志里面是否有关于删除了那张表的操作
cat dmsql_DW1_XXXX_20250825_* | grep TEST(误删的表名或者操作)
根据日志可以看到对表的操作是25日上午10点22分18秒,无条件更新导致的数据误操作,sql执行了1.9s,那么我们恢复到10点22分16秒这个时间点,就是误操作之前的数据了。
在实际生产环境中,我们一定要收集生产环境数据库的授权情况,万一授权过期我们要注意更换,防止数据库出问题。
--授权信息,授权日期不要过期
SELECT SERIES_NO,EXPIRED_DATE,AUTHORIZED_CUSTOMER,cluster_type,MAX_CPU_NUM FROM V$LICENSE;
--版本
SELECT * FROM V$VERSION;
select id_code;
注意:在实际操作中,不可以在生产环境直接备份恢复,要在测试环境上面恢复,尽量提供测试环境,如果无法提供,再考虑初始化一个测试实例进行恢复。
将相关的备份集发送到测试环境
su - root
mkdir -p /data/dmbak_0826
--创建备份集文件夹
mkdir -p /data/dmbak_0826/backup
--创建备份归档文件夹
mkdir -p /data/dmbak_0826/backuparch
赋权
chown -R dmdba:dinstall /data/dmbak_0826
chmod -R 755 /data/dmbak_0826
由于误删表的操作是25号操作的,所以我们是要恢复到25号误删操作的时间点,只需要将23号的全备,24号到25号的增量备份,24号到26号的归档日志发送到测试环境到/data/dmbak_0826
su - dmdba
--备份集
scp -r 备份文件目录 ip地址:/data/dmbak_0826
--归档
scp -r 归档文件目录 ip地址:/data/dmbak_0826/backuparch
我们做恢复的操作一定要注意误删表所属实例的参数,注意是否大小写敏感,字符集等参数。
在DM管理工具,选择连接,我们点击【管理服务器】进去查看数据库实例信息。
可以看到正式库的页为32k PAGE_SIZE=32,簇大小32页 EXTENT_SIZE=32,大小写敏感 CASE_SENSITIVE=Y,字符集为UTF-8 CHARSET=1。
我们创建一个测试实例。如果提供不了测试环境,在生产环境下端口不能跟正式实例一样,SYSDBA,SYSAUDITOR用户名可以先用默认的,备份恢复后,密码都会改。
要用dmdba用户到数据库安装bin目录下执行初始化
su -dmdba
cd /home/dmdba/dmdbms/bin
./dminit path=/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=Y CHARSET=1 DB_NAME=testdb INSTANCE_NAME=testdb PORT_NUM=5237 SYSDBA_PWD=Hn@xxxxx SYSAUDITOR_PWD=Hn@xxxx
看看新创建的测试实例是否能正常启动
--用前台方式启动测试实例
./dmserver /dmdata/testdb/dm.ini
前台启动后看到SYSTEM IS READY,表示启动成功,eixt退出即可
给测试实例注册服务
--root命令注册服务
su - root
cd /home/dmdba/dmdbms/script/root/
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/testdb/dm.ini -p testdb
因为增量恢复会自动从备份搜索路径找全量和其他增量备份,只需要将这些全备和增量备份放到同一个目录下,只需要对最新的增量备份进行restore即可。
./dmrman
--增量备份还原
25号
--还原
RESTORE DATABASE '/dmdata/testdb/dm.ini' FROM BACKUPSET '/data/dmbak_0826/backup/DB_dmdb_INCREMENT_2025_08_25_01_05_24';
现在已经还原到25号增量备份前的所有数据了,但是在实际生产过程中,数据每分每秒都会变化,所以我们需要结合归档日志恢复到具体时间
--恢复指定时间点的归档,看好时间!
RECOVER DATABASE '/dmdata/testdb/dm.ini' WITH ARCHIVEDIR '/data/dmbak_0826/backuparch' UNTIL TIME '2025-08-25 10:22:16';
--如果提示时间错,一定要尝试手敲看看
--更新DB_MAGIC
RECOVER DATABASE '/dmdata/testdb/dm.ini' UPDATE DB_MAGIC;
恢复还原好数据后,我们启动测试实例检查看看,还是先以前台方式启动,如果出现system is ready,表示实例启动成功,我们再用服务来启动实例。
-- 启动数据库
su - dmdba
cd /home/dmdba/dmdbms/bin
--用前台方式启动测试实例
./dmserver /dmdata/testdb/dm.ini
注意:备份还原会将主库密码模式都带过来,所以如果原来正式库是主库模式,还原后这个测试库也变成主库模式,状态就变成了mount
我们改为单机模式
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
alter database normal;
alter database open;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
可以用DM管理工具连接,除了端口号不一样,测试实例的其他账号密码,ip都跟正式库一样。
查看被删除的表,确认表信息是否完全恢复
评估一下恢复的表数据是否正常,如果正常我们就可以开始迁移到正式环境。
点击新建工程
选择迁移的数据库类型
源端写测试实例,因为上面我们是在测试实例上恢复的数据
目的端写误删表的实例
看误删表在哪个模式,就选哪个
选择迁移的表,目的对象修改为tmp表(自定义其他表名),这个表在迁移过程中会自己创建,
确认迁移信息
然后开始导入。
导入成功后我们在正式实例可以看到迁移过来的表
可以使用逻辑导入导出误删表。
可以直接在正式环境利用dexp远程导出测试环境的误删表到指定目录下:
./dexp USERID=SYSDBA/Dameng123@ip:5236 FILE=db_test.dmp DIRECTORY=/dmdata/dmbak LOG=db_test.log TABLES=TEST.TEST
导入到正式环境,
./dimp SYSDBA/Dameng123@ip:5238 file=db_test.dmp log=db_test.log TABLES=TEST.TEST directory=/dmdata/dmbak
停掉测试实例
./DmServicetestdb stop
su -root
cd /home/dmdba/dmdbms/script/root/
./dm_service_uninstaller.sh -n DmServicetestdb
到目录下删除
cd /dmdata/
找到测试实例
rm -rf testdb
文章
阅读量
获赞