达梦数据库(DM8)逻辑备份与还原
摘要:本文介绍了达梦数据库逻辑备份与恢复的核心方法,使用dexp/dimp命令实现四种级别(数据库、用户、模式、表)的备份迁移。通过两台服务器环境演示了整库导出、指定用户导出、模式导出和表级导出的具体操作步骤,并对比了逻辑备份与物理备份在文件类型、恢复能力等方面的差异。文章详细解析了dexp和dimp命令的参数配置,提供了完整的操作实例,包括备份文件生成和日志记录过程,帮助用户掌握达梦数据库的逻辑
文章目录
1概述
逻辑备份的核心是使用dexp(dexpdp)命令将源库进行逻辑导出,使用dimp(dimpdp)命令将该备份文件进行逻辑导入,导入和导出的时候都可以选择四种级别:数据库级别(FULL)、用户级别(OWNER)、模式级别(SCHEMAS)、表级(TABLES)。其中dexp和dexpdp命令、dimp和dimpdp命令在使用上是相同的,只不过dexp导出的文件必须存放在客户端,dexpdp导出的文件必须存放在服务器端,dexpdp和dimpdp命令,两者都是将客户端命令发给服务器启动dexp或者dimp执行,如果客户端连接使用 dm_svc.conf 配置,服务器端也应该跟客户端配置一致。
逻辑备份与物理备份的区别主要是备份生成的文件类型不一致,逻辑备份生成的文件是文本形式的文件,后缀名为.dmp,具有一定的可读性,而物理备份生成的备份集是将内存或磁盘上已经分配、使用的数据页拷贝保存到备份集中,我们无法通过编辑器进行阅读不具备可读性;其次,在备份的范围上,物理备份支持括库备份、表空间备份和表备份、归档日志备份,逻辑备份可以选择四种级别进行备份并且设置更灵活的需求;在生产环境上,由于物理备份集可以结合归档日志实现恢复任意时间点的数据,因此会被用在定时作业中定期对数据库备份。而由于达梦数据库不能像MySQL那样支持按时间点截取二进制日志文件生成自备份后到某个时间点的sql文件,因此逻辑备份不能实现恢复任意时间点的数据;此外,物理备份还原的时候会把源库初始换参数,比如字符集,还原到新的库,而逻辑备份还原则不会发生这种情况。
2环境信息
本文就以dexp和dimp命令在两台服务器进行演示逻辑备份导出和导入,服务器环境如下
主机名 服务ip 数据库名 端口 备注
dmdb01 192.168.30.173 dmdb 5236 源库
dmdb02 192.168.30.175 dmdb 5236 目的库
目录规划:两台服务器的目录位置一致
数据库软件安装目录 /home/dmdba/dmdbms
实例安装目录 /dmdata/
归档日志存放目录 /dmdata/arch
备份文件存放目录 /dmdata/dmbak/
3逻辑导出
3.1命令解析
逻辑备份命令dexp命令既可以对本地数据库也可以对远程数据库进行备份。备份的内容非常灵活,可以选择是否备份索引、数据行和权限,是否忽略各种约束(外键约束、非空约束、唯一约束等),在备份前还可以选择生成日志文件,记录备份的过程以供查看。命令都在数据库安装的bin目录下,在bin目录下按以下命令格式输入即可进行:
逻辑导出命令语法如下:
dexp PARAMETER=<value> { PARAMETER=<value> }
主要包括以下参数:
实例:如果要按SYSDBA用户导出:
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdba_SYSDBA_USER.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdba_SYSDBA_USER_dexp.log OWNER=SYSDBA
3.2整库导出
在导出前源库dmdb01的SYSDBA下面有以下几个表:
目的库dmdb02上SYSDBA模式下面是没有上面的表的:
如果要逻辑导出源库dmdb01整个数据库的信息的话可以在dmdb02机器上执行以下命令:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL.log FULL=Y


执行完成后,在本机的/dmdata/dmbak/目录下会成两个文件,一个是导出文件dmdb01_FULL.dmp,一个是导出过程中记录的日志文件dmdb01_FULL.log。
3.3指定用户导出
在dmdb01上创建一个测试用户,并连接数据库在test用户下创建c1表:
create tablespace test datafile 'test01.dbf' size 128 AUTOEXTEND ON NEXT 10 MAXSIZE 1024;
create user test identified by "密码" default tablespace test default index tablespace test;
grant resource,public,vti,soi,svi to test;
create table test.C1
(
FID INT,
FDESC VARCHAR2(200)
);
insert into test.C1(FID,FDESC) values(1,'创建在TEST下的表');
commit;
select * from test.C1;

可以看到在dmdb01上的TEST模式下就多了一个C1表:
我们如果想要导出dmdb02的TEST用户以及下面所有的表的话,在dmdb02上执行以下命令:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_TES.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST.log OWNER=TEST

可以看到全部信息已经导出,并且在备份目录生成了以下两个文件:
3.4指定模式导出
在源库创建一个TEST2表空间,模式拥有者为TEST用户,并在TEST2模式下创建C2表:
CREATE SCHEMA TEST2 AUTHORIZATION "TEST";
/
create table TEST2.C2
(
FID INT,
FDESC VARCHAR2(200)
);
insert into TEST2.C2(FID,FDESC) values(1,'创建在TEST2模式下的表');
commit;
select * from TEST2.C2;
因为前面创建了表空间test,并且TEST用户默认表空间设置为了test,所以在test表空间下可以看到该表:
如果想单独导出TEST2模式下的所有表的话,可以使用以下命令进行导出:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_TSET2.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST2.log SCHEMAS=TEST2


3.5指定表名导出
在源库的TEST2模式下创建一个C3表:
create table TEST2.C3
(
FID INT,
FDESC VARCHAR2(200)
);
insert into TEST2.C3(FID,FDESC) values(1,'创建在TEST2模式下的表');
commit;
select * from TEST2.C3;
现在TEST2模式下面有C2和C3两个表。
现在如果我只想单独导出C3这个表:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=Table_C3.dmp DIRECTORY=/dmdata/dmbak/ LOG=Table_C3.log TABLES=TEST2.C3

4逻辑导入
逻辑导入的时候如果需要用到对应的表空间、用户、模式的话,需要提前创建好对应的表空间和用户,不然会把表创建在MAIN表空间的。
4.1命令解释
逻辑备份命令dimp命令既可以对本地数据库也可以对远程数据库进行备份。备份的内容非常灵活,可以选择是否备份索引、数据行和权限,是否忽略各种约束(外键约束、非空约束、唯一约束等),在备份前还可以选择生成日志文件,记录备份的过程以供查看。命令都在数据库安装的bin目录下,在bin目录下按以下命令格式输入即可进行:
逻辑导入命令语法如下:
dimp PARAMETER=value { PARAMETER=value }
主要包括以下参数:

实例:如果要按SYSDBA用户导入:
./dimp SYSDBA/'"密码"'@localhost:5236 FILE=dmdba_SYSDBA_USER.dmp LOG=dmdba_SYSDBA_USER_imp.log OWNER=SYSDBA DIRECTORY=/dmdata/dmbak/
4.2整库导入
前面在dmdb02使用了以下命令逻辑导出了全部库的数据:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL.log FULL=Y
如果想要在dmdb02上的实例还原这个备份的话,执行以下命令:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL_dimp.log FULL=Y


执行过程中,已经存在的对象会提示警告,导入后关注一下对应的警告并进行处理:由于执行表是系统表以及这些作业我确定两个库的作业是一样的所以我就可以忽略不进行处理
然后我们就可以在SYSDBA模式下面看到源库dmdb01上创建的表了:
4.3指定用户导入
前面按以下命令将TEST用户下的数据导出:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_TES.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST.log OWNER=TEST
我们可以在dmdb02上执行以下命令进行还原:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_TES.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST_imp.log OWNER=TEST

同时你会看到成功导入:
并且TEST用户和TSET模式也导入过来了:

但是当我们观察表空间的时候会发现,并没有创建test表空间:
查看源库的可以看到源库中c1表是建在test表空间下的,而目的库导入后C1表是创建在MAIN表空间下的:
所以在导入前,我们需要按源库的语法手动创建表空间(可能需要修改表空间路径)、用户并指定默认的表空间,不然的话会把表创建MAIN表空间下!
参考源库的表空间和用户的创建语法,在导入前先进行创建:
create tablespace test datafile 'test01.dbf' size 128 AUTOEXTEND ON NEXT 10 MAXSIZE 1024;
create user test identified by "密码" default tablespace test default index tablespace test;
grant resource,public,vti,soi,svi to test;
然后再使用前面的导入语法进行导入后就可以了。
那个警告是提示TEST模式已存在,因为创建用户的时候会默认创建同名的模式,这个警告可以忽略
然后可以看到C1就不在创建到MAIN表空间了:
4.4指定模式导入
在前面我们使用以下命令导出了TEST2模式:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_TSET2.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST2.log SCHEMAS=TEST2
在导入前我们不需要提前创建TEST2模式了,这个TEST2模式拥有者TSET和TEST所属默认的表空间test也提前在dmdb02上创建好了,我们如果想导入TEST2模式及其下面的所有表的话使用以下命令进行导入:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_TSET2.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST2_imp.log SCHEMAS=TEST2

可以看到TEST2模式和下面的C2表均成功导入:
4.5指定表名导入
前面按以下命令导出C3这个表到备份文件中:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=Table_C3.dmp DIRECTORY=/dmdata/dmbak/ LOG=Table_C3.log TABLES=TEST2.C3
如果要在目的库单独导入C3表这个数据的话,你需要目的库已创建对应的模式:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=Table_C3.dmp DIRECTORY=/dmdata/dmbak/ LOG=Table_C3_imp.log TABLES=TEST2.C3

然后登录目标库就可以查到改表的数据了:
注意:导入和导出的TABLES指定的模式必须一致,导出的时候源库的模式是TEST2,然后导入的目的库模式是TEST3的话,是会报错的:(不管TEST3在目的库是否提前创建好都无法导入)
所以导入的时候,可以这么理解TABLES指的是备份文件中的表名。如果导入的时候想换个表名可以使用REMAP_TABLE参数进行指定,比如将源库TEST2.C3的表导入后为TEST2.c4表:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=Table_C3.dmp DIRECTORY=/dmdata/dmbak/ LOG=Table_C3_imp.log TABLES=TEST2.C3 REMAP_TABLE=C3:C4


此外,REMAP_TABLE指定的时候不能在表名的前面加个模式名,这个参数只是改名的作用。
5实战案例
前面也演示了常用的四个级别的逻辑备份,下面再演示一下其他常见的应用场景。
5.1数据迁移/重新初始化实例
在DM数据库部署后,用户在使用一段时间后想要修改字符集或者大小写敏感等这种在实例初始化就不能修改的参数则需要使用逻辑备份和恢复,如果使用物理备份的话,还原的时候是会将字符集等数据库初始化参数也还原的,所以只能使用逻辑备份还原。
首先,在源库使用全备进行数据导出:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL.log FULL=Y
然后在目的库,按源库的表空间、用户创建语法进行创建对应的表空间和用户,创建语法参考:
create tablespace test datafile 'test01.dbf' size 20480 AUTOEXTEND ON NEXT 10 MAXSIZE 102400;
create user test identified by "密码" default tablespace test default index tablespace test;
grant resource,public,vti,soi,svi to test;
创建完成后,使用以下命令将备份导入到目的库:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL_dimp.log FULL=Y
另外,如果是跨数据库版本的还原的话(低版本数据库数据导入到高版本数据库),需要按用户进行逻辑导出和导入,其中还要关注SYSDBA模式下是否有创建表,如果没有创建的话,还原的时候只需要指定客户创建的用户进行导入即可。
5.2把一个模式下的表导入到另一个模式
在进行数据迁移的时候,如果源库TEST2模式下的表想迁移到目标库的TEST3模式下,或者之前遇到过就是要迁移的模式在源库这个模式拥有者是SYSDBA,目标库这个模式的拥有者却不是SYSDBA,那么在源库进行导入的时候正常按模式进行导出:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_TSET2.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST2.log SCHEMAS=TEST2
在逻辑导入到目标库的时候指定模式映射参数REMAP_SCHEMA
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_TSET2.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_TEST2_imp.log SCHEMAS=TEST2 REMAP_SCHEMA=TEST2:TEST3
5.3从逻辑备份文件中恢复某张表的数据
恢复误删除的数据其实我们可以在全备和增量备份以及归档日志来进行数据恢复,但是恢复全备的话如果数据量比较大的话,这样恢复时间可能比较长,如果我们知道某个逻辑导出的备份文件含有这个表的数据的话,我们就可以从这个备份集里面拿对应的表的数据。
本地有一份全备文件dmdb01_FULL.dmp,是通过以下命令导出来的
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL.log FULL=Y
这个文件可能是定时脚本备份出来的也可能是在操作数据前进行导出的备份。
我们现在发现TEST2.C3这个表的记录被全备delete掉了,现在想把C3的数据进行恢复到TEST2.C5这张表,可以使用以下命令:
cd /home/dmdba/dmdbms/bin
./dimp USERID=SYSDBA/'"密码"'@localhost:5236 FILE=dmdb01_FULL.dmp DIRECTORY=/dmdata/dmbak/ LOG=dmdb01_FULL_TEST2.C3.log TABLES=TEST2.C3 REMAP_TABLE=C3:C5
5.4从按过滤条件备份表数据
前面演示了我们可以从一个备份文件里面按表进行恢复数据,在逻辑备份导出数据的时候,我们也可以选择对某个表符合某个条件的记录进行导出,这样可以减少备份文件的大小。
在逻辑导出的时候,除了指定某个表,还可以指定QUERY参数,在QUERY参数中可以配置where条件实现数据过滤。比如想导出TEST2.C3这个表中FID<10的数据,可以这样写导出命令:
cd /home/dmdba/dmdbms/bin
./dexp USERID=SYSDBA/'"密码"'@192.168.30.173:5236 FILE=QUERY_C3.dmp DIRECTORY=/dmdata/dmbak/ LOG=QUERY_C3.log TABLES=TEST2.C3 QUERY="where FID<10"
达梦社区地址:https://eco.dameng.com/
更多推荐
所有评论(0)