当前位置: 首页 > news >正文

【Oracle】闪回相关操作

数据库级别:
Oracle10g 时需要在mount状态开启,11g之后可以在open下打开,但前提是必须开启数据库归档。建议在mount状态下开启.

配置方法:
12C:

SQL>show parameter recover
SQL>show parameter db_flash
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G;
SQL>ALTER SYSTEM SET DB_RECOVER_FILE_DEST='/home/oracle/flash';
SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880 SCOPE=BOTH; --默认是1440 一天
SQL> ALTER DATABASE FLASHBACK ON;

应用场景:
数据库升级前
数据库做压力测试前

应用举例:

SQL> create table t1 as select * from dba_objects;
Table created.找出当前scn:查询下当前scn时表里数据的条目
SQL>select current_scn from v$database;
100008080SQL>select count(*) from t1;模拟压力测试插入数据:
SQL> insert into t1 select * from t1;
SQL>commitSQL> startup mount force;
ORACLE instance started.Total System Global Area  636100608 bytes
Fixed Size                  1338392 bytes
Variable Size             226493416 bytes
Database Buffers          402653184 bytes
Redo Buffers                5615616 bytes
Database mounted.
SQL> flashback database to scn 1182885;Flashback complete.SQL> alter database open resetlogs;
打开数据库则必须使用 RESETLOGS创建普通还原点:
SQL>CREATE RESTORE POINT test_POINT;SQL> FLASHBACK DATABASE TO RESTORE point test_POINT; 可靠还原点 :
CREATE RESTORE POINT test_guarantee GUARANTEE FLASHBACK DATABASE;FLASHBACK DATABASE TO RESTORE point test_guarantee;基本时间点的闪回:
FLASHBACK DATABASE TO TIMESTAMP(TO_DATE('2016-01-18 06:19:00', 'YYYY-MM-DD HH24:MI:SS'));SQL>alter database flashback off;  关闭闪回数据库

表级别

闪回表
Drop、delete或错误的更新删除表里的记录。
Drop表的恢复:
sys的对像不进回收站
SQL> show parameter recycle
SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD4/PROD4/test.dbf' size 10m;Tablespace created.SQL> create user zjk identified by oracle default tablespace test;User created.SQL> grant dba to zjk;Grant succeeded.SQL> conn zjk/oracle
Connected.
SQL> create table TEST1 as select * from dba_objects;Table created.SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='TEST1';SUM(BYTES)/1024/1024
--------------------9SQL>select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by TABLESPACE_NAME;
no rows selectedSQL> DROP TABLE TEST1;Table dropped.SQL>select TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM dba_free_space WHERE TABLESPACE_NAME='TEST' GROUP BY TABLESPACE_NAME;TABLESPACE_NAME                SUM(BYTES)/1024/1024
------------------------------ --------------------
TEST                                              9SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST1            BIN$JAkhk08TMaDgUL4KHGhpXg==$0 TABLE        2015-11-08:14:23:08SQL> flashback table "BIN$JAkhk08TMaDgUL4KHGhpXg==$0" to before drop;Flashback complete.create table test(id number,name varchar2(10));
drop table test;
create table test(id number,depart_name varchar2(10));
drop table test;SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$HwOgJaEC91vgUL4KHGgVGw==$0 TABLE        2015-09-05:17:49:33
TEST             BIN$HwOgJaEB91vgUL4KHGgVGw==$0 TABLE        2015-09-05:17:49:32SQL> desc "BIN$HwOgJaEC91vgUL4KHGgVGw==$0";Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                                 NUMBERDEPART_NAME                                        VARCHAR2(10)SQL> flashback table "BIN$HwOgJaEC91vgUL4KHGgVGw==$0" to before drop rename to testnew;Flashback complete.SQL> desc testnew;

delete表的恢复:
开发人员delete时使用了错误的where条件,前提是知道操作的大概的时间点,
示例:

SQL> create table emp as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees; 查看下操作系统时间date
SQL> select count(*) from emp;COUNT(*)
----------107SQL>delete emp  where department_id =100 ;(其实业务人员是想删除部门id=10的员工结果误操作)
SQL> select count(*) from emp;COUNT(*)
----------101使用闪回表的技术来闪回误删除的数据:
SQL>select count(*) from emp AS OF timestamp to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss') where department_id=100;
SQL> Flashback table emp to timestamp  to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss');
Flashback table emp to timestamp  to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss')*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabledSQL> alter table emp enable row movement;Table altered.SQL> Flashback table emp to timestamp  to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss');Flashback complete.SQL> select count(*) from emp;COUNT(*)
----------107

稳妥做法:利用闪回查询查下删除前的状态,如果想保留下来就把数据插到一张新表里,然后insert回原来表里

SQL>select * from emp AS OF timestamp to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss') where department_id=100;
Create table emp2 as ……………..
SQL>insert into emp select * from emp2;

对于truncate的表,除了flashback database之外,其它的flashback功能可能帮不了你)
闪回查询:
示例:

SQL>create table emp as select * from employees;
SQL>select count(*) from emp;
SQL>!date  或 select current_scn from v$database;
SQL>delete emp;
SQL>COMMIT;
SQL>select count(*) from emp;SQL>select count(*) from emp AS OF timestamp to_date('2016-07-20 08:18:45','yyyy-mm-dd hh24:mi:ss') where department_id=100;select count(*) from emp AS OF scn 12343243  where department_id=100;

闪回版本查询:
flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录。
比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。

示例:

SQL> connect test/test
Connected.
SQL> create table t1(ID int,NAME varchar2(10));
Table created.
我们执行一系列如下的操作:insert into T1 values(1,'A');commit;update T1 set ID=2;commit;update T1 set ID=3;commit;update T1 set ID=4;现在,我们看到该表最后的记录是
SQL> select * from T1;4      A

如果我们利用flash table或者是flash query,我们也只能是看到过去的某一个快照而已,利用flashback version query,我们将找到其中的任何变化:

SQL>select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAMEfrom t1 versions between timestamp minvalue and maxvalueorder by VERSIONS_STARTTIME;

当然,除了分析以上所有的变更之外,我们可以指定时间段,如

select ID,NAME
from test versions between timestamp
to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss');

还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:

select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001

注意:
此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。所做的这些工作不需要历史表或额外的列。
flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。
上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。

闪回事务查询:
Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog。

示例:

a、打开数据库补充日志:
sql>alter database add supplemental log data;
b、打开主键补充日志:
sql>alter database add supplemental log data (primary key) columns;
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择
Create table test2 as select * from departments;
####################################
transaction 1  INSERT INTO hr.test2 VALUES (280,'ERP', NULL, 1700)
/
INSERT INTO hr.test2 VALUES (290,'Support Operations', NULL, 1700)
/
INSERT INTO hr.test2 VALUES (300,'HR Training', NULL, 1700)
/
commit
/
####################################
transaction 2 update hr.test2 set department_id=310 where department_id=280
/
commit
/####################################
transaction 3 update hr.test2 set department_name='ABC'   where department_id=310
/
commit

基于事务ID查询:
select * from flashback_transaction_query where xid=‘0A000200EE010000’;
select * from flashback_transaction_query where TABLE_NAME=’DSSFDSA’;
闪回归档:
从Oracle Database 11g开始,Oracle 提供了一个这样的功能:闪回数据归档(Flashback Data Archive)。通过这一功能Oracle数据库可以将UNDO数据进行归档,从而提供全面的历史数据查询,也因此Oracle引入一个新的概念Oracle Total Recall,也即Oracle全面回忆功能。闪回数据归档可以和我们一直熟悉的日志归档类比,日志归档记录的是Redo的历史状态,用于保证恢复的连续性;而闪回归档记录的是UNDO的历史状态,可以用于对数据进行闪回追溯查询;后台进程LGWR用于将Redo信息写出到日志文件,ARCH进程负责进行日志归档;在Oracle 11g中,新增的后台进程FBDA(Flashback Data Archiver Process)则用于对闪回数据进行归档写出

示例:

1、创建一个默认的闪回数据归档,取名为“FRA1”:SQL> create tablespace fratbs datafile '/u01/app/oracle/oradata/PROD4/PROD4/fratbs.dbf' size 100m;SQL> create user fr_admin identified by oracle default tablespace fratbs;
SQL> grant connect,dba to fr_admin; 
SQL> grant flashback archive administer to fr_admin;Grant succeeded.SQL> create flashback archive default fra1 tablespace fratbs quota 100m retention 1 year;2、创建一个较小的undo表空间,并设置当前数据库使用该undo表空间:
SQL> create undo tablespace undotbs2 datafile '/home/oracle/undotbs2.dbf' size 10m;
SQL> alter system set undo_tablespace=undotbs2;
SQL>STARTUP FORCE;
创建一个测试表:SQL>create table t5 as select * from dba_objects;
SQL>SELECT COUNT(*) FROM T5;
COUNT(*)
----------289828
SQL>SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------886393
给表开启闪回归档
SQL> alter table HR.T5 flashback archive FRA1;SQL>DELETE T5 WHERE ROWNUM<10000;
SQL>COMMIT;
SELECT COUNT(*) FROM T5 AS OF SCN 886393;
看执行计划是数据是从undo中查到的。执行一小段批量循环删除,使UNDO数据老化覆盖:
SQL>delete t5 WHERE ROWNUM<10000;
COMMIT;

通过执行计划可以看到,查询闪回来自SYS_FBA_TCRV_ 74564系统表,该表隶属于闪回归档表空间,用于记录闪回数据。
取消对于数据表的闪回归档可以使用如下命令:

alter table table_name no flashback archive;

常用数据字典:
闪回功能生成的字典对象有多个,通过查询USER_TABLES/USER_OBJECTS视图可以获得这些对象的详细信息:

SQL> select table_name,tablespace_name from user_tables where table_name like '%FBA%';SQL> select OWNER_NAME,FLASHBACK_ARCHIVE_NAME,RETENTION_IN_DAYS,STATUS from DBA_FLASHBACK_ARCHIVE;
SQL>select TABLE_NAME,OWNER_NAME,FLASHBACK_ARCHIVE_NAME,ARCHIVE_TABLE_NAME,STATUS from DBA_FLASHBACK_ARCHIVE_TABLES;
SQL> select * from DBA_FLASHBACK_ARCHIVE_TS
闪回技术笔记

1、闪回表

SQL> show parameter recycleNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle                  string
db_recycle_cache_size                big integer 0
recyclebin                           string      onSQL> select name from v$datafile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/orcl/users01.dbf
/u01/app/oracle/oradata/orcl/orcl/example01.dbf10 rows selected.SQL> create tablespace test datafile '/u01/app/oracle/oradata/orcl/orcl/test.dbf' size 10m;Tablespace created.SQL> create user sf identified by oracle default tablespace test;User created.SQL> grant dba to sf;Grant succeeded.SQL> conn sf/oracle
Connected.
SQL> create table TEST1 as select * from dba_objects;create table TEST10 as select * from dba_objects;Table created.SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='TEST1';SUM(BYTES)/1024/1024
--------------------9SQL> show recyclebin
SQL> desc dba_free_space;     Name                                      Null?    Type----------------------------------------- -------- ----------------------------TABLESPACE_NAME                                    VARCHAR2(30)FILE_ID                                            NUMBERBLOCK_ID                                           NUMBERBYTES                                              NUMBERBLOCKS                                             NUMBERRELATIVE_FNO                                       NUMBERSQL> select TABLESPACE_NAME,bytes/1024/1024 from dba_free_space where tablespace_name='TEST'; --查看TEST表空间剩余量select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by TABLESPACE_NAME; --查看所有表空间的剩余量
no rows selectedSQL> DROP TABLE TEST1;Table dropped.select TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM dba_free_space WHERE TABLESPACE_NAME='TEST' GROUP BY TABLESPACE_NAME;
TABLESPACE_NAME                SUM(BYTES)/1024/1024
------------------------------ --------------------
TEST                                              9SQL> alter database datafile 9 autoextend on;SQL>  select TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM dba_free_space WHERE TABLESPACE_NAME='TEST' GROUP BY TABLESPACE_NAME;TABLESPACE_NAME                SUM(BYTES)/1024/1024
------------------------------ --------------------
TEST                                              9SQL> create table test2 as select * from dba_objects;Table created.SQL> show paramter recyclebinSQL>  select TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM dba_free_space WHERE TABLESPACE_NAME='TEST' GROUP BY TABLESPACE_NAME;no rows selectedSQL> drop table test2;Table dropped.SQL> show parameter recyclebin
show  recyclebinORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST2            BIN$JAkhk08TMaDgUL4KHGhpXg==$0 TABLE        2015-11-08:14:23:08
SQL> alter database datafile 11 autoextend off;Database altered.SQL> alter database datafile 9 resize 20m;alter database datafile 9 resize 10m;Database altered.SQL> select TABLESPACE_NAME,SUM(BYTES)/1024/1024 FROM dba_free_space WHERE TABLESPACE_NAME='TEST' GROUP BY TABLESPACE_NAME;TABLESPACE_NAME                SUM(BYTES)/1024/1024
------------------------------ --------------------
TEST                                             19SQL> create table test3 as select * from dba_objects;Table created.SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST2            BIN$JAkhk08TMaDgUL4KHGhpXg==$0 TABLE        2015-11-08:14:23:08SQL> select * from tab;TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$JAkhk08TMaDgUL4KHGhpXg==$0 TABLE
TEST3                          TABLESQL> flashback table "BIN$JAkhk08TMaDgUL4KHGhpXg==$0" to before drop;
flashback table "BIN$i6USmIX6EDvgU0IQqMCSVw==$0" to before drop;Flashback complete.SQL> select * from tab;TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST2                          TABLE
TEST3                          TABLESQL> 
purge recyclebin;create table testa(id number,name varchar2(10));
drop table testa;
create table testa(id number,depart_name varchar2(10));
drop table testa;SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$HwOgJaEC91vgUL4KHGgVGw==$0 TABLE        2015-09-05:17:49:33
TEST             BIN$HwOgJaEB91vgUL4KHGgVGw==$0 TABLE        2015-09-05:17:49:32SQL> select owner,object_name,ts_name from DBA_RECYCLEBIN;OWNER                          OBJECT_NAME                    TS_NAME
------------------------------ ------------------------------ ------------------------------
sf                            BIN$HwOgJaEB91vgUL4KHGgVGw==$0 USERSSQL> desc "BIN$HwOgJaEC91vgUL4KHGgVGw==$0";Name                                      Null?    Type----------------------------------------- -------- ----------------------------ID                                                 NUMBERDEPART_NAME                                        VARCHAR2(10)SQL> flashback table "BIN$HwOgJaEC91vgUL4KHGgVGw==$0" to before drop rename to testnew;Flashback complete.SQL> desc testnew;DROP TABLE <table_name> [PURGE] ;

######################################
2、查询表已删除的数据 (闪回查询)

SQL> create table ORIGINAL_SALARY as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees; 
create table ORIGINAL_SALARY1 as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees; 
create table ORIGINAL_SALARY3 as select EMPLOYEE_ID from hr.employees; 
create table ORIGINAL_SALARY5 as select EMPLOYEE_ID from hr.employees; select * from ORIGINAL_SALARY1 where EMPLOYEE_ID=102;
查看下操作系统时间date2019-06-19 11:36:54delete ORIGINAL_SALARY where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));
delete ORIGINAL_SALARY1 where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));insert 24 05:36:55 UTC 2016
02:19:22 select * from ORIGINAL_SALARY AS OF timestamp to_date('2019-06-19 11:26:27','yyyy-mm-dd hh24:mi:ss') where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));
select * from ORIGINAL_SALARY1 AS OF timestamp to_date('2019-06-19 11:26:27','yyyy-mm-dd hh24:mi:ss') where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));
select count(*) from ORIGINAL_SALARY3 AS OF timestamp to_date('2019-06-19 11:36:54','yyyy-mm-dd hh24:mi:ss');
select count(*) from ORIGINAL_SALARY3 AS OF timestamp to_date('2019-06-19 11:39:00','yyyy-mm-dd hh24:mi:ss');
select count(*) from ORIGINAL_SALARY5 AS OF timestamp to_date('2019-06-19 11:45:45','yyyy-mm-dd hh24:mi:ss');
select count(*) from ORIGINAL_SALARY5 AS OF timestamp to_date('2019-06-19 11:46:08','yyyy-mm-dd hh24:mi:ss');create view orig_view as select * from ORIGINAL_SALARY AS OF timestamp to_date('2016-05-27 02:19:22','yyyy-mm-dd hh24:mi:ss') ;02:15:40 UTC 2016
--delete 整个表后可以使用flashback table 找回SQL> alter table test enable row movement;--先打开行移动的功能flashback  table  ORIGINAL_SALARY  to timestamp to_date('2016-07-12 02:17:33','yyyy-mm-dd hh24:mi:ss'); 
flashback  table  DEPARTMENTS to timestamp to_date('2016-05-27 03:09:22','yyyy-mm-dd hh24:mi:ss');

————————————————————————————————————

对于truncate的表,除了flashback database之外,其它的flashback功能可能帮不了你)
truncate table test2;

flashback database to timestamp to_timestamp('2016-02-24 05:36:55','yyyy-mm-dd hh24:mi:ss');

########################################
3、闪回数据库(在数据库升级前可打开闪回数据库或做压力测试前打开)

确保归档是打开的

SQL>show parameter recover
SQL>show parameter db_flashSQL> select flashback_on from v$database;FLASHBACK_ON
------------------
NO

在oracle11g中打开闪回数据库可以在open状态打开

归档是必须要开启

下面这是oracle10g时的操作:

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=2G;
SQL> ALTER SYSTEM SET db_recovery_file_dest ='/u01/app/oracle/flash';
SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880 SCOPE=BOTH; --默认是1440 一天
SQL> ALTER DATABASE FLASHBACK ON;
SQL> ALTER DATABASE OPEN;

##############################################################
估算闪回数据库日志所需要的磁盘空间:

select estimated_flashback_size,retention_target,flashback_size from v$flashback_database_log;

确定当前闪回窗口,确定可闪回到的最小scn号

SELECT oldest_flashback_scn, oldest_flashback_timeFROM   V$FLASHBACK_DATABASE_LOG;

监视闪回数据库日志中的事件记录:

SELECT begin_time, end_time, flashback_data, db_data, redo_data, estimated_flashback_size AS EST_FB_SZE FROM V$FLASHBACK_DATABASE_STAT;

找出当前scn:

select current_scn from v$database;

获得当前SCN

 select current_scn from v$database;*** select dbms_flashback.get_system_change_number from dual;3010059SQL> create table t1 as select * from dba_objects;create table t2 as select * from dba_objects;Table created.SQL> insert into t1 select * from t1;
insert into t2 select * from t2;SQL> startup mount force;
ORACLE instance started.Total System Global Area  636100608 bytes
Fixed Size                  1338392 bytes
Variable Size             226493416 bytes
Database Buffers          402653184 bytes
Redo Buffers                5615616 bytes
Database mounted.
SQL> flashback database to scn 1182885;Flashback complete.SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项SQL> alter database open resetlogs;创建普通还原点:
SQL> CREATE RESTORE POINT test_POINT;SQL> FLASHBACK DATABASE TO RESTORE point test_POINT; 可靠还原点 :
CREATE RESTORE POINT test_guarantee GUARANTEE FLASHBACK DATABASE;FLASHBACK DATABASE TO RESTORE point test_guarantee;基本时间点的闪回:
FLASHBACK DATABASE TO TIMESTAMP(TO_DATE('2016-01-18 06:19:00', 'YYYY-MM-DD HH24:MI:SS'));

#########################################
4、创建一个默认的闪回数据归档,取名为“FRA”,操作者必须拥有SYSDBA权限:

SQL> create tablespace fratbs datafile '/u01/app/oracle/oradata/orcl/orcl/fratbs.dbf' size 50m;SQL> create user fr_admin identified by oracle default tablespace fratbs;
SQL> grant connect,dba to fr_admin; 
SQL> grant flashback archive administer to fr_admin;Grant succeeded.SQL> create flashback archive default fra tablespace fratbs quota 10m retention 1 year;
SQL> alter table SH.PROMOTIONS flashback archive;SQL> select OWNER_NAME,FLASHBACK_ARCHIVE_NAME,RETENTION_IN_DAYS,STATUS from DBA_FLASHBACK_ARCHIVE;
SQL> select TABLE_NAME,OWNER_NAME,FLASHBACK_ARCHIVE_NAME,ARCHIVE_TABLE_NAME,STATUS from DBA_FLASHBACK_ARCHIVE_TABLES;

####################################################

5、flash version query

flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录,比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。
flashback version query一样依赖于AUM(自动undo管理),所以,这里就不再多说AUM的配置。flashback version query采用VERSIONS BETWEEN语句来进行查询
,常用的有:
·VERSIONS_SCN – 系统改变号
·VERSIONS_TIMESTAMP – 时间下面将展示这个 flashback version querySQL> connect test/test
Connected.
SQL> create table t1(ID int,NAME varchar2(10));
Table created.
我们执行一系列如下的操作:insert into T1 values(1,'A');commit;update T1 set ID=2;commit;update T1 set ID=3;commit;update T1 set ID=4;现在,我们看到该表最后的记录是
16:34:49 SQL> select * from T1;A      B
---------- ----------5 16:34:34
这个时候,如果我们利用flash table或者是flash query,我们也只能是看到过去的莫一个快照而已,利用flashback version query,我们将找到其中的任何变化,如
SQL>select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAMEfrom t1 versions between timestamp minvalue and maxvalueorder by VERSIONS_STARTTIME;SELECT * FROM (select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAMEfrom t1  versions between timestamp minvalue and maxvalueorder by VERSIONS_STARTTIME) WHERE NAME='B' ;VERSIONS_STARTTIME        VERSIONS_ENDTIME               VERSIONS_XID     V         ID NAME
------------------------- ------------------------------ ---------------- - ---------- ----
12-OCT-15 02.01.30 PM                                    01000D00C3010000 U          5 D
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0600110096020000 I          4 C
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0A001F00FB010000 I          1 A
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          04001C002B020000 U          3 B
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          080009006D030000 U          2 B
12-OCT-15 02.01.30 PM                                    090002008E020000 D          3 Bselect versions_starttime, versions_endtime, versions_xid,versions_operation,salaryfrom employees versions between timestamp minvalue and maxvalue where employee_id=107order by VERSIONS_STARTTIME;

注意:
此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。
所做的这些工作不需要历史表或额外的列。
flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 — 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到(这个将在flashback transaction query中描述)。

当然,除了分析以上所有的变更之外,我们可以指定时间段,如

select ID,NAME
from test versions between timestamp
to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss');

还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:

select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001

############################################

6、flashback transaction query闪回事务:
Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog,在考试中我们使用em来操作,举例如下:

 a、打开数据库补充日志:
sql>alter database add supplemental log data;
b、打开主键补充日志:
sql>alter database add supplemental log data (primary key) columns;
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择/*== transaction 1 ==*/INSERT INTO hr.departments VALUES (280,'ERP', NULL, 1700)
/
INSERT INTO hr.departments VALUES (290,'Support Operations', NULL, 1700)
/
INSERT INTO hr.departments VALUES (300,'HR Training', NULL, 1700)
/
commit
//*== transaction 2 ==*/update hr.departments set department_id=310 where department_id=280
/
commit
//*== transaction 3 ==*/update hr.departments set department_name='ABC'   where department_id=310
/
commitalter system switch logfile; 切三遍以上
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择:将上面的事务操作闪回到第一次update之前。

##########################################################

闪回与字符集

Oracle 闪回技术 与 Oracle字符集设置

闪回技术
闪回技术是若干技术的集合 包含对数据库整体的闪回 对表的闪回 对事务的闪回
面试题:简述Oracle数据库闪回技术
1.闪回Oracle数据库
2.闪回表
3.闪回事务

数据库闪回
要想实现数据库闪回
1.必须配置数据库的恢复区

SQL> show parameter recoverNAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest		     string
db_recovery_file_dest_size	     big integer 0

数据库的恢复区 可用用来存放多种数据 比如:控制文件的镜像 redo文件的镜像 归档 备份 闪回日志(只能存放在这里)
闪回日志
数据库能够实现时间的倒退(闪回)要依赖闪回日志的记录

! mkdir -p /full/flash --创建快速回复区(如果已经创建请直接跳过)
alter system set db_recovery_file_dest_size=2G;
alter system set db_recovery_file_dest='/full/flash';

2.开启数据库的闪回功能

(1)保证数据库已经运行在归档模式 
SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
(2)查询是否已经开启闪回 
SQL> select FLASHBACK_ON from v$database;FLASHBACK_ON
------------------
NO
开启闪回
alter database flashback on ;
SQL> select FLASHBACK_ON from v$database;FLASHBACK_ON
------------------
YES验证数据库的闪回功能 
SQL> create table t1 as select * from dba_objects;Table created.SQL> select current_scn from v$database;CURRENT_SCN
-----------1679739SQL> create table t2 as select * from t1;Table created.SQL> alter system switch logfile;System altered.SQL> /System altered.SQL> /System altered.SQL> truncate  table t1;Table truncated.SQL> shutdown immediateSQL> startup mount SQL> flashback database to scn 1679739;SQL> alter database open resetlogs;

生产上 闪回数据库这个操作 不能够用来找回误删除的数据
1.闪回需要数据库运行在mount阶段 意味着需要关闭数据库
2.闪回到过去的时间点后 在这期间数据库的所有数据全部丢失

闪回数据库技术能干什么
1.压力测试后 回退数据
2.数据库版本升级

在生产上 误删除了数据 可以用备份恢复的方式找回数据

闪回表
1.drop表后 将表闪回
利用Oracle的回收站功能

回收站

SQL> show parameter recycNAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
recyclebin			     string	 on

回收站各个用户之间独立

回收站的空间属性问题

SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD4/PROD4/test.dbf' size 10m;Tablespace created.SQL> create user bsr identified by oracle default tablespace test;User created.
SQL> conn bsr/oracle
Connected.SQL> create table TEST1 as select * from dba_objects;Table created.SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='TEST1';SUM(BYTES)/1024/1024
--------------------9SQL> show recyclebin
SQL> desc dba_free_space;     Name                                      Null?    Type----------------------------------------- -------- ----------------------------TABLESPACE_NAME                                    VARCHAR2(30)FILE_ID                                            NUMBERBLOCK_ID                                           NUMBERBYTES                                              NUMBERBLOCKS                                             NUMBERRELATIVE_FNO                                       NUMBERSQL> select TABLESPACE_NAME,bytes/1024/1024 from dba_free_space where tablespace_name='TEST';
select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by TABLESPACE_NAME; 
no rows selectedSQL> DROP TABLE TEST1;Table dropped.DROP表的本质 是将表进行改名 并且 将段使用的空间从永久变为临时show recyclebin
flashback table "BIN$xxxxx" to before drop [rename to 表名]

2.delete行 将表中已删除的行找回

SQL> create table SALARY as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees;查看下操作系统时间datedelete SALARY where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));

闪回查询 只要修改的数据在undo中存放 就可以在查询时 添加时间点 找到对应的数据 如果undo中数据被覆盖 那么会报快照过旧
Fri Apr 12 02:49:47 UTC 2019

select * from SALARY AS OF timestamp to_date('2019-04-12 02:49:47','yyyy-mm-dd hh24:mi:ss') where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));EMPLOYEE_ID COMMISSION_PCT
----------- --------------102delete t1 where 条件 name=fuxianupdate t1 set salary=salary+1000 where name=fuxianinsert into table xxx values( );
02:15:40 UTC 2016
--delete 整个表后可以使用flashback table 找回SQL> alter table test enable row movement;--先打开行移动的功能flashback  table  SALARY  to timestamp to_date('2019-04-12 02:49:49','yyyy-mm-dd hh24:mi:ss'); 

————————————————————————————————————
两种方式 生产上 尽量用第一种方式 插入的方式
因为数据的还原值都在undo里记录 我们可以利用undo对数据进行闪回版本查询

flash version query
flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录,比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。
flashback version query一样依赖于AUM(自动undo管理),所以,这里就不再多说AUM的配置。flashback version query采用VERSIONS BETWEEN语句来进行查询
,常用的有:
·VERSIONS_SCN – 系统改变号
·VERSIONS_TIMESTAMP – 时间

下面将展示这个 flashback version query

SQL> connect test/test
Connected.
SQL> create table t1(ID int,NAME varchar2(10));
Table created.
我们执行一系列如下的操作:insert into T1 values(1,'A');commit;update T1 set ID=2;commit;update T1 set ID=3;commit;update T1 set ID=4;现在,我们看到该表最后的记录是
16:34:49 SQL> select * from T1;A      B
---------- ----------5 16:34:34

这个时候,如果我们利用flash table或者是flash query,我们也只能是看到过去的莫一个快照而已,利用flashback version query,我们将找到其中的任何变化,如

SQL>select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAMEfrom t1 versions between timestamp minvalue and maxvalueorder by VERSIONS_STARTTIME;SELECT * FROM (select versions_starttime, versions_endtime, versions_xid,versions_operation,ID,NAMEfrom t1  versions between timestamp minvalue and maxvalueorder by VERSIONS_STARTTIME) WHERE NAME='B' ;VERSIONS_STARTTIME        VERSIONS_ENDTIME               VERSIONS_XID     V         ID NAME
------------------------- ------------------------------ ---------------- - ---------- ----
12-OCT-15 02.01.30 PM                                    01000D00C3010000 U          5 D
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0600110096020000 I          4 C
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          0A001F00FB010000 I          1 A
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          04001C002B020000 U          3 B
12-OCT-15 02.01.30 PM     12-OCT-15 02.01.30 PM          080009006D030000 U          2 B
12-OCT-15 02.01.30 PM                                    090002008E020000 D          3 Bselect versions_starttime, versions_endtime, versions_xid,versions_operation,salaryfrom employees versions between timestamp minvalue and maxvalue where employee_id=107order by VERSIONS_STARTTIME;

注意:
此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。
所做的这些工作不需要历史表或额外的列。
flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 — 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到(这个将在flashback transaction query中描述)。

当然,除了分析以上所有的变更之外,我们可以指定时间段,如
select ID,NAME
from test versions between timestamp
to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')
and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss');还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:
select versions_starttime, versions_endtime
from test versions
between scn 1000 and 1001flashback transaction query闪回事务:
Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog,在考试中我们使用em来操作,举例如下:a、打开数据库补充日志:
sql>alter database add supplemental log data;
b、打开主键补充日志:
sql>alter database add supplemental log data (primary key) columns;
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择/*== transaction 1 ==*/INSERT INTO hr.departments VALUES (280,'ERP', NULL, 1700)
/
INSERT INTO hr.departments VALUES (290,'Support Operations', NULL, 1700)
/
INSERT INTO hr.departments VALUES (300,'HR Training', NULL, 1700)
/
commit
//*== transaction 2 ==*/update hr.departments set department_id=310 where department_id=280
/
commit
//*== transaction 3 ==*/update hr.departments set department_name='ABC'   where department_id=310
/
commitalter system switch logfile; 切三遍以上
然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择:将上面的事务操作闪回到第一次update之前。

Oracle的字符集
utf8
zhs16gbk
字符集
计算机语言 二进制语言 01 每个国家对于自己国家语言的二进制代码设计是不一样的
zhs16gbk 简体中文字符集 中 01010 国 01100 0101001100
utf8 A 010 B 100 C 110 ABC 010001110
0101001100 ABC
乱码

字符集是在创建数据库时选择的。请选择最能满足您现在和将来业务需要的字符集,因为选定字符集后很难再更改。
很难再更改=改不了 非要修改 只能删库重建

DBA在建库之间 数据库叫什么 用什么字符集

查询操作系统字符集:
locale ( unix or linux)
chcp (windows)

查询数据库所支持的数据库字符集:

select * from v$nls_valid_values where parameter='CHARACTERSET';
数据库服务器字符集select * from nls_database_parameters where parameter like '%CHARACTERSET%';  其来源于props$,是表示数据库的字符集。客户端字符集环境 select * from v$nls_parameters where parameter in   ( 'NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');  --查看客户端字符集表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表会话字符集环境 select * from nls_session_parameters; ,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。

影响Oracle数据库字符集最重要的参数是NLS_LANG参数。

它的格式如下: NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。

其中:
Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
Territory: 指定服务器的日期和数字格式
Charset: 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK

从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。

set NLS_LANG=AMERICAN_CHINA.ZHS16GBK
set NLS_LANG=Simplified Chinese_china.ZHS16GBK
echo $NLS_LANG$ 查看当前的操作系统的环境变量的字符集设置
修改当前会话的字符集:   export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 
当前数据库使用的字符集:SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%';--当前数据库使用的字符集
select * from v$nls_parameters where parameter in   ( 'NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');  --查看客户端字符集
ALTER SESSION SET NLS_LANGUAGE= 'SIMPLIFIED CHINESE' NLS_TERRITORY= 'CHINA' NLS_NUMERIC_CHARACTERS='AL32UTF8';
alter session set NLS_NUMERIC_CHARACTERS= '.,';

###########################################################################

set NLS_LANG=AMERICAN_AMERICA.AL32UTF8 windows上设置    set NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280select id,name,dump(name,1016) from t;
export  NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
set NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280
set NLS_LANG=AMERICAN_AMERICA.US7ASCII
set NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280"
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
set nls_lang=Simplified Chinese_China.AL32UTF8

#############################################

如果想正确导出源数据库数据,则 Export 过程中用户会话字符集应等于源
数据库字符集或是源数据库字符集的超集

查询 oracle client  端的字符集:
在 windows 平台下,就是注册表里面相应 OracleHome 的 NLS_LANG。还可
以在 dos 窗口里面自己设置,
比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在 unix 平台下,就是环境变量 NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现 server 端与 client 端字符集不一致,请统一修改为同
server 端相同的字符集。
http://www.dtcms.com/a/302049.html

相关文章:

  • UV安装并设置国内源
  • easyexcel填充方式导出-合并单元格并设置边框
  • QML QtCharts 极坐标图(PolarChartView)
  • 【WRF-Chem第二期】WRF-Chem有关 namelist 详解
  • 学习lxml库:Python XML/HTML处理利器
  • 安宝特方案丨智能革新安全管控:AR技术赋能物流仓储行业安全升级
  • C++中既重要又困难的部分—类和对象
  • Pandas 里的分箱操作
  • 《Linux服务与安全管理》| samba服务器配置匿名模式
  • 数据结构——图(二、图的存储和基本操作)
  • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
  • 设计模式(二十)行为型:观察者模式详解
  • 常用设计模式系列(十五)—解释器模式
  • 修改CentOS的SSH登录端口(22端口)
  • python任意模块间采用全局字典来实现借用其他类对象的方法函数来完成任务或数据通信的功能
  • STM32入门之DMA直接存储器存取
  • 第4章唯一ID生成器——4.3 基于时间戳的趋势递增的唯一ID
  • Java 排序
  • LeetCode 刷题【18. 四数之和】
  • Flutter实现Android原生相机拍照
  • 如何在技术世界中保持清醒和高效
  • iphone手机使用charles代理,chls.pro/ssl 后回车 提示浏览器打不开该网页
  • NI Ettus USRP X440 软件无线电
  • 免费 SSL 证书申请简明教程,让网站实现 HTTPS 访问
  • PyTorch 使用指南
  • 基于Spring Boot的审计日志自动化解决方案,结合SpEL表达式和AOP技术,实现操作轨迹自动记录,并满足GDPR合规要求
  • <七> CentOS 8 安装最新版本Docker
  • 从零开始的云计算生活——第三十七天,跬步千里,ansible之playbook
  • LWGJL教程(8)——基础知识
  • JavaScript手录-排序算法篇