搞数据库的人,谁没被备份还原折腾过?尤其是用PLSQL Developer这工具,看起来简单,真到迁移数据或者恢复库的时候,各种坑踩得你怀疑人生。今天我就跟你聊聊,怎么用PLSQL把备份还原这事儿整明白,既不用写脚本,也不用求DBA,自己就能搞定。

先说备份。很多人一上来就用“导出表”功能,点几下就完事,结果恢复的时候发现数据不全、字段错位,甚至乱码。问题出在哪儿?PLSQL的备份其实分几种:表结构备份、数据备份、还有整个schema的备份。最常用的是“导出表”里的“PL/SQL Developer”格式,但这玩意儿有个坑——它默认只导出数据,不导出序列、触发器这些依赖。你要是只依赖这个,迁移后会发现自增ID全乱了,业务跑不起来。正确的做法是,导出时勾选“包括存储”、“包括触发器”、“包括序列”,这些选项藏在“导出表”对话框的“选项”标签页里,别嫌麻烦,多点几下。另外,导出路径别用中文名,PLSQL对中文路径支持不好,容易报错“无法创建文件”。我吃过这亏,折腾了一下午才发现是路径问题。
再说还原。拿到备份文件后,别急着点“导入表”。很多人以为导入就是反向操作,直接双击文件就完事。其实PLSQL的导入比导出更挑细节。比如,你导出的文件是.sql格式,导入时得先清空目标表的数据,否则主键冲突会让你报错。更稳妥的做法是,在导入前用“工具”菜单里的“导入表”功能,选择“SQL文件”,然后勾选“在插入前删除现有记录”。这步很多人忽略,结果数据重复,还得手动删。还有个小技巧:如果数据量超过10万条,别用默认的“逐条插入”,改成“使用数组插入”,数组大小设成500或者1000,速度能快三倍。我试过,100万条数据,默认方式要40分钟,用数组插入10分钟就完事。
备份还原里最让人头疼的,是跨版本迁移。比如你把11g的数据导到19c,或者从Windows迁到Linux。PLSQL在这种场景下特别容易翻车,因为版本差异会导致数据类型不兼容。比如,11g的DATE类型在19c里可能被识别成TIMESTAMP,导入后日期格式全乱。解决方法是,导出时在“选项”里把“日期格式”设成“YY-MM-DD HH24:MI:SS”,同时勾选“使用ANSI SQL语法”。这能让PLSQL生成标准SQL,而不是Oracle专有语法,兼容性更好。另外,跨平台迁移时,字符集问题也得留意。导出前用“SELECT USERENV(‘LANGUAGE’) FROM DUAL”查一下当前字符集,如果目标库是AL32UTF8而源库是ZHS16GBK,导出前最好把NLSLANG环境变量改成目标库的字符集,否则中文会变成乱码。我有个客户,就是因为没改这个,迁移后所有中文备注全是问号,回滚花了三天。
说到回滚,很多人以为PLSQL备份就是全量备份,忘了增量备份这事儿。实际上,如果你每天跑批,数据量几十万条,全量导出一次要半小时,时间长了磁盘也扛不住。PLSQL有个“导出表”的“筛选条件”功能,你可以按时间戳或者ID范围只导增量数据。比如,每天凌晨跑批后,写个SQL筛选出“INSERTDATE > SYSDATE - 1”的记录,导出成单独的文件。还原时,先导入全量备份,再导入增量备份,这样就省时间。但注意,增量备份的导入顺序不能乱,必须先导全量再导增量,否则主键冲突。我一般会在文件名上加时间戳,比如“data20250101full.sql”和“data20250102inc.sql”,方便按顺序执行。
还有一种情况,你得把数据从测试环境还原到生产环境,或者从生产库抽一部分数据到开发库。这时候全量导出太粗,容易把敏感数据泄露。PLSQL的“导出表”支持按SQL查询结果导出,你可以在“导出表”对话框里选“SQL查询”,写个“SELECT * FROM users WHERE status = ‘active’”,只导出活跃用户。这比导出整张表再删数据安全得多。而且,你可以把查询结果保存成CSV或者HTML格式,方便非技术人员查看。比如,业务部门要核对订单数据,你直接导个CSV发过去,不用给他们开数据库权限。但注意,CSV格式不支持大字段,比如CLOB或者BLOB,得先转成VARCHAR2才能导出。
聊个实战案例。去年我帮一个电商公司做数据库迁移,从Oracle 11g迁到19c,数据量大概200GB。他们之前用exp/imp命令,但每次都要DBA写脚本,出问题还得回滚。我建议他们用PLSQL分批导出:按照订单日期,每个月导出一个文件,一共24个文件。还原时,先导入结构脚本,再按顺序导入数据文件。中间遇到字符集问题,我在导出前改了NLSLANG,然后每个文件导入前都用“SET NLSLANG=AMERICAN_AMERICA.AL32UTF8”设环境变量。整个过程花了3天,比用exp/imp快了一倍,而且没有一次回滚。最关键的是,业务人员也能参与,他们只需要按文件名顺序点导入就行,不用懂SQL。
你看,PLSQL备份还原这事儿,说难也难,说简单也简单。关键在于搞清楚每个选项的作用,别盲目点“下一步”。导出时多想一步:目标库是什么版本?字符集对不对?需要哪些依赖?还原时多看一眼:数据冲突吗?速度够快吗?路径对吗?把这些细节抠到位,你就能轻松搞定数据库迁移与恢复,再也不用求爷爷告奶奶了。下次遇到备份任务,别慌,打开PLSQL,按我上面说的来,你也能成为别人眼中的“大神”。


