【IT168 独家】
编者言:在4月份举办的2010中国数据库与商业智能技术大会上,国产数据库的代表厂商达梦高调亮相,给一向由国外厂商把持的企业商业数据库市场带来不小的波澜。人们开始纷纷将目光投向国产数据库软件市场,开始关注由中国人自己开发的数据库产品。
国产数据库产品究竟能不能用?在功能和特性上够不够用?为了解开这些疑问,我们特邀请在数据库业界众多知名的技术专家亲身试用相关产品,并真实地写出自己的试用感受。这些专家大都是Oracle数据库的ACE,或者是对其它主流的商业数据库十分精通和了解,让他们站在这样的角度来客观写出自己对国产数据库的技术评测,是非常有说服力的。
尽管各位专家的工作都十分繁忙,但他们还是都认为,将国产数据库软件在技术上的真实情况书写出來,给出自己中肯的评价,这是一件非常有意义的工作。 更令人欣慰的是,相比过去,今天像达梦这样的国产数据库产品已经显得非常自信,它们希望听到业界技术专家的建议甚至是批评,不断完善自己的产品和功能,这将是一个非常良性的循环,长此下去,我们相信,摆在国产数据库脚下的将是更为宽广的道路!
作者简介:杨廷琨(网名Yangtingkun),现任海虹医药电子商务有限公司首席DBA, ITPUB论坛Oracle数据库管理版版主,知名社区技术专家。2004年曾参与编写《Oracle数据库性能优化》一书,2007年被Oracle公司授予Oracle ACE称号,喜欢研究Oracle相关的技术问题,他的技术博客上积累了1500多篇Oracle相关的原创技术文章。
前几天ITPUB的熊主编和我联系,希望我能参加国产数据库达梦的试用活动,并写几篇使用感受。本来最近手头的事情比较多,本打算推辞的,不过熊主编再三邀请,而且强调并非是枪手文,只要写出真实使用感受即可。既然如此,我就本着支持国产数据库的原则,写几篇试用感受。
达梦6.0试用之备份恢复(即将发布)
由于本人唯一熟悉的数据库就是Oracle,因此所有的对比都是与Oracle数据库进行对比,在这个过程中,将尽可能避免将对Oracle数据库的喜爱之情带进来,争取站在一个比较公正的位置上来进行评价。
这一篇简单介绍一下达梦数据库的导入导出操作。
达梦数据库的备份也分为物理备份和逻辑备份。
逻辑备份通过expdb和impdb实现,有意思的是,这两个工具的名称与Oracle10g推出的数据库expdp/impdp很接近,不过在语法和功能上与Oracle数据库exp/imp更加类似。
导出工具expdb支持两种模式,一种与Oracle的exp兼容,另一种兼容达梦早起版本的语法,其中前一种提供的功能更强大,因此这里只描述和exp兼容的模式。
login success
即将导出指定的表通过常规路径 ...
. . 正在导出表 "test"."test"."T" 4 行被导出
****************** total ***********************
0 databases output...
0 schemas output...
1 tables output...
0 indexes output...
0 triggers output...
0 views output...
0 stored procedures output...
0 sequences output...
0 roles output...
0 dblinks output...
0 synonyms output...
********************* end **********************
成功终止导出, 没有出现警告。
语法完全和Oracle的exp一致,不用过多的解释,不过也有一些不方便的地方。比如userid不能省略;比如不提供密码不会以隐藏方式提示输入,而是直接保存;再比如userid、file和log参数都是必选参数,不能忽略使用默认值。
下面看看导出整个TEST用户和导出TEST数据库:
login success
即将导出指定的表通过常规路径 ...
. . 正在导出表 "test"."test"."t_num" 0 行
. . 正在导出表 "test"."test"."T_PART_COL" 0 行
. . 正在导出表 "test"."test"."T_PART_RANGE" 0 行
. . 正在导出表 "test"."test"."T_PART_HASH" 0 行
. . 正在导出表 "test"."test"."T_RECORD" 1000000 行被导出
. . 正在导出表 "test"."test"."t" 4 行被导出
4 procedures output...
****************** total ***********************
1 databases output...
2 schemas output...
6 tables output...
22 indexes output...
0 triggers output...
0 views output...
4 stored procedures output...
1 sequences output...
0 roles output...
0 dblinks output...
2 synonyms output...
********************* end **********************
成功终止导出, 没有出现警告。
C:\dmdbms\bin>expdb userid=test/testtest file=e:\dmdbms\backup\test.dmp log=e:\dmdbms\backup\test.log owner=test
login success
即将导出指定的表通过常规路径 ...
. . 正在导出表 "test"."test"."t_num" 0 行
. . 正在导出表 "test"."test"."T_PART_COL" 0 行
. . 正在导出表 "test"."test"."T_PART_RANGE" 0 行
. . 正在导出表 "test"."test"."T_PART_HASH" 0 行
. . 正在导出表 "test"."test"."T_RECORD" 1000000 行被导出
. . 正在导出表 "test"."test"."t" 4 行被导出
4 procedures output...
****************** total ***********************
0 databases output...
1 schemas output...
6 tables output...
22 indexes output...
0 triggers output...
0 views output...
4 stored procedures output...
1 sequences output...
0 roles output...
0 dblinks output...
2 synonyms output...
********************* end **********************
成功终止导出, 没有出现警告。
除了上面介绍的这几个例子,expdb还支持绝大部分exp的参数。可能是与达梦数据库的内存管理机制有关,expdb不支持buffer和recordlength等与客户端分配内存有关的参数。
下面再看看导入工具,和expdb一样,impdb也支持两种模式,一种是Oracle的imp兼容模式,另一种是与老版本兼容的模式,推荐使用功能更强的第一种模式。
impdb version: 0X1000101
login success
表 t 已经存在
. . 正在导入表 test.test.t
4行被导入
Error Code -2352: 无效的同义词名 'S_T'
CREATE SYNONYM "S_T" FOR "test"."T"
Error Code -2352: 无效的同义词名 'S_TEST'
CREATE SYNONYM "S_TEST" FOR "test"."F_TAX"
****************** total ***********************
0 databases input...
1 schemas input...
0 tables input...
0 indexes input...
0 triggers input...
0 views input...
0 stored procedures input...
0 sequences input...
0 roles input...
0 dblinks input...
0 synonyms input...
********************* end **********************
成功终止导入, 但出现警告
可以看到,虽然和Oracle的imp命令兼容,但是处理方式还是有所区别的。再导入的时候选择的是全用户导出的dmp文件,不过导入的时候明确指定了导入表T,impdb在导入过程中,确实过滤了表,只导入T表的数据,但是用户中的其他对象,比如同义词被再次导入。这一点应该算是个小bug吧。
最后看一个FROMUSER/TOUSER的导入:
impdb version: 0X1000101
login success
Error Code -1970: 授权者没有此授权权限
GRANT "DBA" TO "test";
Error Code -1970: 授权者没有此授权权限
GRANT "PUBLIC" TO "test";
.. 正在导入表 test.ABC.t_num 0行被导入
.. 正在导入表 test.ABC.T_PART_COL 0行被导入
.. 正在导入表 test.ABC.T_PART_RANGE 0行被导入
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555518" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555519" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555520" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555521" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555522" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
.. 正在导入表 test.ABC.T_PART_HASH 0行被导入
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555523" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555524" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555525" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555526" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555527" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555528" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555529" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555530" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555531" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555532" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555533" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555534" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555535" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555536" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555537" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555538" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555539" ON
"T_PART_HASH" ("ID" ASC);
. . 正在导入表 test.ABC.T_RECORD
1000000行被导入
. . 正在导入表 test.ABC.t
4行被导入
Error Code -2352: 无效的同义词名 'S_T'
CREATE SYNONYM "S_T" FOR "test"."T"
Error Code -2352: 无效的同义词名 'S_TEST'
CREATE SYNONYM "S_TEST" FOR "test"."F_TAX"
****************** total ***********************
0 databases input...
1 schemas input...
6 tables input...
0 indexes input...
0 triggers input...
0 views input...
4 stored procedures input...
1 sequences input...
0 roles input...
0 dblinks input...
0 synonyms input...
********************* end **********************
成功终止导入, 但出现警告
可以看到,大部分对象处理都没有问题,但是对于分区表而言,虽然表导入了,但是建立索引的时候出现了很多错误,这说明导入工具处理分区表还存在bug。
不过总的来说,expdb和impdb对于exp/imp工具的兼容性还是非常不错的,对于一个没有多少达梦数据库经验的人,只要对Oracle的exp/imp熟悉,就可以很快上手进行操作了。