用途
---------------
这篇文档提供了关于优点和知道问题的信息,当数据从oracle9i中输出时,oracle10g或oracle11g数据库中使用查询选项的选择(时间点)
作用域和使用
----------------
这篇文章为使用oracle9i,oracle10g,或oracle11g的想用导出工具的用户准备,oracle9i,oracle10g,或oracle11g数据库输出‘时间点输出数据’。
这个导出数据将在某一特定SCN一致(FLASHBACK_SCN)或者一个具体的时间(FLASHBACK_TIME)。
这篇文章给出了一些关于参数和限制的异同的信息,典型的错误信息,和相关的可能的工作区漏洞。
参数FLASHBACK_SCN和FLASHBACK_TIME:时间点输出
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简介
-------------------
1.Oracle9i的开始,这个导出工具提供输出关于指定的的时间点。下面给你一个例子:为了导出一个表的典型数据,在这行已经发生错误,或一行被错误删除。
2. 在输出期间,oracle运用一个系统改变值(SCN)为了完成一致的输出。
SCN将被输出参数指定:
- FLASHBACK_SCN或
- FLASHBACK_TIME
3. 在输出期间,程序包DBMS_FLASHBACK被调用来确保过去时间的值得到取回。相同的限制适用于标准(SQL*Plus-)程序包的使用,也适用于输出。
4.FLASHBACK_SCN和FLASHBACK_TIME的缺省值为“none”,意思是当输出数据时,闪回选项不被使用。
差异
------------------
为了输出一致的时间点数据,oracle运用一个系统的改变值。这个系统改变值(SCN)是一个不断增长的值,唯一标识受约束的版本的数据库。每一次用户有错误,oracle记录一个SCN。
一个简单的办法获得当前的SQL*Plus的SCN,是通过运用DBMS_FLASHBACK程序包的GET_SYSTEM_CHANGE_NUMBER函数(你必须要有执行权)。比如:
SQL> SET numwidth 20
SQL> SELECT dbms_flashback.get_system_change_number FROM DUAL;
GET_SYSTEM_CHANGE_NUMBER
--------------------------------------------------
2106860
或从oracle10gR1开始,你可以查询v$database view:
SQL> SELECT current_scn FROM v$database;
CURRENT_SCN
-----------------------------
2106860
1. 参数FLASHBACK_SCN。
----------------------------------------
a. 输出参数指定的SCN,输出将用于闪回。输出数据一致操作完成指定的SCN。
b. 缺省值:none。
c. 例子:
exp system/manager file=exp.dmp flashback_scn=2106860
2. 参数FLASHBACK_TIME。
----------------------------------------------
a. 输出参数指定一个时间戳,格式"YYYY-MM-DD HH24:MI:SS"为。输出发现最接近SCN。SCN被用来能够查询过去的事件。
b. 缺省值:none。
c. 你指定参数FLASHBACK_TIME在命令行。
比如:
exp system/manager file=exp.dmp flashback_time='"2004-06-19 13:24:26"'
d.你也可以指定参数FLASHBACK_TIME在参数文件里。
注意双引号一定要去掉以防错误产生,比如:
EXP-00008: ORACLE error 1841 encountered
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
Example:
exp system/manager parfile=exp.par
exp.par
-------
file=exp.dmp
flashback_time='2004-06-19 13:24:26'
e.oracle10GR1开始你可以运用函数TO_TIMESTAMP指定你想要的一些时间格式。
比如windows下的oracle10g:
exp system/manager file=exp.dmp flashback_time=\"TO_TIMESTAMP('19-06-2004
13:24:26', 'DD-MM-YYYY HH24:MI:SS')\"
Unix下的oracle10g:
exp system/manager file=exp.dmp flashback_time=\"TO_TIMESTAMP\(\'19-06-
2004 13:24:26\', \'DD-MM-YYYY HH24:MI:SS\'\)\"
f.当oracle10g在参数文件里用函数TO_TIMESTAMP
用双引号:
FLASHBACK_TIME="TO_TIMESTAMP('19-06-2004 13:24:26', 'DD-MM-YYYY HH24:MI:SS')"
限制
----------------------------
闪回查询原理依靠自动还原管理到需要的还原数据。依靠有效的存储容量。
数据库可能不一定能够保存所有的需要的还原数据。如果你在输出中运用闪回参数你可能需要熟悉你自己的对于自动的还原管理去明白他的权限和局限性。
1. 兼容性
--------------------------
FLASHBACK_SCN和FLASHBACK_TIME能够唯一被指定为导出工具对于Oracle9i,Oracle10g and Oracle11g,(包括Oracle10g/11g输出数据汞和Oracle10g/11g的输入数据汞与参数NETWORK_LINK结合)。因此这些参数只实用于Oracle9i,Oracle10g and Oracle11g数据库。
2. 数据库设置
------------------------------
为了从数据库中成功输出时间点,自动的还原管理将被DBA设置:
a. 设置UNDO_RETENTION的初始值(在短时间内)代表你想要查过去多远的时间。
b. 设置初始化参数UNDO_MANAGEMENT=AUTO。
c. 建立一个还原点空间,要有足够的空间存储需要的数据。有多少数据更新,就需要多少空间。
更详细的说明:
Note:143217.1 "Oracle9i New Feature: Flashback"
在表空间里设置3个小时(3 * 60 * 60 = 10800)的保留后,UNDOTBS1,'UNDO'-参数将看似:
SQL> SHOW PARAMETER undo
NAME TYPE VALUE
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
3. 权限
-----------------------------
在一个输出声明里你你可以用FLASHBACK_SCN和FLASHBACK_TIME参数之前,你一定要允许DBMS_FLASHBACK程序包的执行特权,比如:
sqlplus /nolog
SQL> connect / as sysdba
SQL> GRANT execute ON dbms_flashback TO scott;
SQL> exit
4. 命令行与交互
当用到交互方式时候你不能调用FLASHBACK_SCN或者FLASHBACK_TIME参数的输出。为了调用一个闪回输出操作,你必须运用命令行方式或者参数文件。
5. 输出模式
------------------------
你不能调用FLASHBACK_SCN或者FLASHBACK_TIME参数的输出当在表空间模式里面输出时(i.e.当指定参数TRANSPORT_TABLESPACES=Y)。先决条件是可运输的表空间Export/Import,是输出做的当与AS SYSDBA连接。然而,当连接AS SYSDBA,你不能调用闪回输出。
6. 其他类型的闪回局限性
----------------------------------
a. 数据定义语言语句在表结构之后,比如下降/调试栏目,移动表格,删除表分区,缩短表格/分区,等等,表格里面无效的还原数据,从一个更早的点检索一个片段是不可能的当DDLs被执行以后。这限制对于DDL操作更改表的存储属性是不实用的,比如,PCTFREE, INITTRANS,和MAXTRANS。比如增加新的范围,约束,或者分割的操作同样免除这些限制。
指定在FLASHBACK_TIME的时间被映射成一个SCN值。一般地SCN-time映射在数据库启动后的每5分钟被记录。因此它可能出现好像下舍到5分钟。由于这些time-to-SCN映射,用倒叙法来表现的输出一段时间后,立即创造一个表可能会导致一个ORA-1466错误。一个SCN-based出口一次给你一个精确的方式检索一个过去的数据片段。
b. 一般地,闪回跟踪查询特征的时间,最多不超过5天。这一时期反映服务器正常工作时间。你必须记录自己的SCN对感兴趣的时间,比如在执行删除之前。
例子
----------------------------------------
--在客户端设置环境变量NLS_DATE_FORMAT,
e.g.对于MS-windows平台:
C:\> SET NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
-- for C-shell:
-- $ setenv NLS_DATE_FORMAT 'YYYY-MM-DD HH24:MI:SS'
-- for KORN-shell:
-- $ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
-- for VMS:
-- DEFINE/NOLOG NLS_DATE_FORMAT "YYYY-MM-DD HH24:MI:SS"
-- Start SQL*Plus and connect as SYS and grant usage of dbms_flashback
-- to user scott:
conn / as sysdba
GRANT EXECUTE ON dbms_flashback to scott;
COMMIT;
-- Connect as scott, define variable for SCN-output and create table:
conn scott/tiger
CREATE TABLE flash AS SELECT * FROM EMP;
COMMIT;
SELECT COUNT(*) FROM flash;
SELECT SYSDATE, dbms_flashback.get_system_change_number FROM DUAL;
-- E.g: +----+---------------------+---------+
-- |rows| date | SCN |
-- +----+---------------------+---------+
-- | 14 | 2004-06-19 13:15:21 | 2103125 |
-- +----+---------------------+---------+
-- To prevent ORA-1466 "table definition has changed", wait 5 minutes,
-- and again check the rows/date/SCN, before deleting the rows.
SELECT COUNT(*) FROM flash;
SELECT SYSDATE, dbms_flashback.get_system_change_number FROM DUAL;
-- E.g: +----+---------------------+---------+
-- |rows| date | SCN |
-- +----+---------------------+---------+
-- | 14 | 2004-06-19 13:24:26 | 2106860 |
-- +----+---------------------+---------+
DELETE FROM flash;
COMMIT;
SELECT COUNT(*) FROM flash;
COUNT(*)
----------
0
-- Run the export, specifying a SCN before the delete;
-- this will export 14 rows of table FLASH:
HOST exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2106860
TYPICAL ERRORS
--------------
1. ORA-6550 and PLS-201
--------------------
An export fails with the following errors:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2106860
EXP-00008: ORACLE error 6550 encountered
ORA-06550: line 1, column 14:
PLS-00201: identifier 'DBMS_FLASHBACK' must be declared
ORA-06550: line 1, column 14:
PL/SQL: Statement ignored
EXP-00000: Export terminated unsuccessfully
当用户执行输出操作的时候'DBMS_FLASHBACK'的错误PLS-201经常出现,没有DBMS_FLASHBACK程序包的执行权。
解决方案:同意执行权和重新运行同样的输出指令。
比如:
sqlplus /nolog
SQL> connect / as sysdba
SQL> GRANT EXECUTE ON dbms_flashback TO scott;
SQL> exit
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2106860
2. ORA-8180
--------------------------------
下面的输出失败:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-10 13:24:26"'
EXP-00008: ORACLE error 8180 encountered
ORA-08180: no snapshot found based on specified time
ORA-06512: at "SYS.DBMS_FLASHBACK", line 0
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
当时间被指定时错误ORA-8180出现,被映射到一个SCN,为所不及一个有效的scn。最可能这个指定的时间数据已经超出了5天(服务器正常工作)。超过5天以后你不能闪回(服务器正常工作),不考虑UNDO_RETENTION。
解决方案:指定较新的数据闪回,比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-12 13:24:26"'
3. ORA-8181
--------
下面出现一个错误输出:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=1994829
EXP-00008: ORACLE error 8181 encountered
ORA-08181: specified number is not a valid system change number
ORA-06512: at "SYS.DBMS_FLASHBACK", line 0
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
当SCN被指定时出现ORA-8181错误,远于一个正确的scn(以前相同的错误,见上文)。
解决方案:
指定一个有效的scn(更大的数),符合一段时间,没有超过5天(服务器正常工作),或者指定FLASHBACK_TIME立即时间,比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=1994900
4. ORA-1555
--------
出现下面的错误:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-15 13:24:26"'
EXP-00056: ORACLE error 1555 encountered
ORA-01555: snapshot too old: rollback segment number 3 with name
"_SYSSMU3$" too small
EXP-00000: Export terminated unsuccessfully
当闪回数据没有足够的还原表空间就会出现ORA-1555的错误,这由以下原因引起:
a. 指定的FLASHBACK_TIME时间超出了初始化的值,或者参数UNDO_RETENTION;
或
b.UNDO表空间太小。
解决方案:指定较新的时间。比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-19 13:24:26"'
另外:考虑增加INIT.ORA参数UNDO_RETENTION的值和UNDO表空间的空间。
5. ORA-1466
--------
输出完成,但是有下面的错误:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2105000
EXP-00056: ORACLE error 1466 encountered
ORA-01466: unable to read data - table definition has changed
Export terminated successfully with warnings.
导致错误ORA-1466的原因如下:
a. 表结构的变化:
DDL声明导致了表结构的变化,比如drop/modify
column, move table, drop partition, truncate table/partition,等等,无效的更早的时间片段比如当DDLs被执行后。
b. 立即指定一个SNC或时间,在DDL操作之后
解决方案:指定较新的SCN或者时间,比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2106860
6. ORA-8185
--------
出现下面错误:
7. exp 'system/manager as sysdba' file=exp_flash.dmp log=exp_flash.log
tables=scott.flash flashback_scn=2106860
8. EXP-00008: ORACLE error 8185 encountered
ORA-08185: Flashback not supported for user SYS
ORA-06512: at "SYS.DBMS_FLASHBACK", line 0
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
9. or in Oracle10g:
10. EXP-00008: ORACLE error 8185 encountered
ORA-08185: Flashback not supported for user SYS
ORA-06512: at "SYS.DBMS_FLASHBACK", line 3
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
11. or until 10.1.0.3 Export DataPump:
12. ORA-39001: invalid argument value
ORA-39135: SYS schema cannot read data using specific SCNs
出现ORA-8185 或者ORA-39135是因为FLASHBACK_SCN 或者FLASHBACK_TIME参数不能被连接AS SYSDBA的用户执行。
解决方法:在没有连接AS SYSDBA时候重新发送命令。比如:
exp system/manager file=exp_flash.dmp log=exp_flash.log
tables=scott.flash flashback_scn=2106860
7. ORA-1830 or ORA-1843 or other time-format errors
------------------------------------------------
出现下面的错误:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"19-JUN-2004 13.24.26"'
EXP-00008: ORACLE error 1830 encountered
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at line 1
EXP-00000: Export terminated unsuccessfully
he error ORA-1830 (as above), or ORA-1843 (not a valid month), or several
other date-format related errors, are reported when the FLASHBACK_TIME
parameter doesn't have the format: "YYYY-MM-DD HH24:MI:SS"
解决方法:在格式正确的情况下重新发送命令。比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-19 13:24:26"'
7. EXP-95
------
出现下面的错误:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_scn=2106850 flashback_time='"2004-06-19 13:24:26"'
EXP-00095: Flashback_time and Flashback_scn are not compatible
EXP-00000: Export terminated unsuccessfully
出现错误EXP-95的原因是参数FLASHBACK_TIME 和the
FLASHBACK_SCN被指定
解决方法:当只有一个闪回参数时重新发送命令。比如:
exp scott/tiger file=exp_flash.dmp log=exp_flash.log tables=flash
flashback_time='"2004-06-19 13:24:26"'