前言:客戶需要遷移XX 庫 ZJJJ用戶(遷移到其他數據庫),由於業務復雜,客戶都弄不清楚里面有哪些業務系統,為保持數據一致性,需要停止業務軟件,中間件,殺掉oracle進程。
溫馨提示:很多網上資料只是簡單的導入,導出(其實大家都會),並沒有進行數據對比,以及統計信息的收集,就會業務反饋特別慢,原因是導入的數據還是原先的統計信息。
一、遷移數據倒出部分
=============================================================
1、前期准備
停止業務軟件,中間件,殺掉oracle進程
ps -ef | grep LOCAL=NO | awk '{print $2}' | xargs kill -9
2、檢查無效對象
--統計失效的對象:
select owner, object_type,status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type;
結果如下:
OWNER OBJECT_TYPE STATUS COUNT(*)
------------------------------ ------------------- ------- ----------
ZJJJ PACKAGE BODY INVALID 1
--查看具體失效對象
col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;
OWNER OBJECT_NAME OBJECT_TYPE STATUS
-------------------- -------------------------------- ---------------- -------
ZJJJ PKG_XXFW_SMS PACKAGE BODY INVALID
--執行腳本編譯數據庫失效對象。
@$ORACLE_HOME/rdbms/admin/utlrp.sql
編譯無效,需要業務人員手動編譯。
3、EXP 按用戶導出
用戶 表空間
ZJJJ TBS_YW_DATA
select username,account_status,default_tablespace,temporary_tablespace from dba_users;
USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ -------------------------------- ------------------------------ ---------------------
WEIXIN OPEN WEIXIN TEMP
ZJJJ OPEN TBS_YW_DATA TEMP
KETTLE OPEN USERS TEMP
SYS OPEN SYSTEM TEMP
SYSTEM OPEN SYSTEM TEMP
已選擇24行。
select * from dba_sys_privs where grantee in ('ZJJJ') order by 1;
GRANTEE PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
ZJJJ CREATE TYPE NO
ZJJJ UNLIMITED TABLESPACE NO
ZJJJ CREATE TRIGGER NO
ZJJJ CREATE SEQUENCE NO
ZJJJ DEBUG CONNECT SESSION NO
ZJJJ CREATE PROCEDURE NO
ZJJJ CREATE TABLE NO
ZJJJ CREATE VIEW NO
已選擇8行。
select * from dba_role_privs where grantee in('ZJJJ') order by 1;
GRANTEE GRANTED_ROLE ADM DEF
------------------------------ ------------------------------ --- ---
ZJJJ EXP_FULL_DATABASE NO YES
ZJJJ RESOURCE NO YES
ZJJJ IMP_FULL_DATABASE NO YES
ZJJJ CONNECT NO YES
設置字符集(expdp不用設置)
查看字符集:
SQL>select userenv('language') from dual;
AMERICAN _ AMERICA. ZHS16GBK
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
exp system/oracle@CCDB direct=y recordlength=65535 buffer=104857600 file=d:/temp-2017-02-23/exp_zjjj.dmp log=d:/temp-2017-02-23/exp_zjjj.log feedback=10000 owner=zjjj
注釋:如果不開並行,exp和expdp速度差距不大,我主張用expdp,尷尬的是領導要我用exp這種方式。
4、檢查對象下表的具體行數
set serveroutput on size 1000000
set pages 50000
spool d:/temp-2017-02-23/laoku-zjjj.txt
DECLARE
v_cnt number;
BEGIN
FOR rec in (select 'ZJJJ.' || TABLE_NAME AS tanme from dba_tables where owner='ZJJJ' order by 1)
LOOP
execute immediate 'select count(*) from '||rec.tanme into v_cnt;
dbms_output.put_line(rpad(rec.tanme,40,'-')||v_cnt);
END LOOP;
END;
/
=============================================================
*********************************
二、遷移倒入部分
=============================================================
修改數據庫默認參數
1、創建表空間&用戶
SQL> select name from v$datafile;
NAME
------------------------------------------------------
+CCDG/dcpdb/datafile/system.260.933443685
+CCDG/dcpdb/datafile/sysaux.261.933443687
+CCDG/dcpdb/datafile/undotbs1.262.933443689
+CCDG/dcpdb/datafile/undotbs2.264.933443695
+CCDG/dcpdb/datafile/users.265.933443697
SQL>
create tablespace TBS_YW_DATA datafile '+CCDG' size 2G autoextend on next 500m;
create user ZJJJ identified by zjjj default tablespace TBS_YW_DATA;
grant EXP_FULL_DATABASE,RESOURCE,IMP_FULL_DATABASE,CONNECT to ZJJJ;
grant CREATE TYPE,UNLIMITED TABLESPACE,CREATE TRIGGER,CREATE SEQUENCE,DEBUG CONNECT SESSION,CREATE PROCEDURE,CREATE TABLE,CREATE VIEW to ZJJJ;
2、IMP按用戶導入
設置字符集(impdp不用設置)
查看字符集:
SQL>select userenv('language') from dual;
AMERICAN _ AMERICA. ZHS16GBK
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
imp system/oracle@ccdb fromuser=zjjj touser=zjjj file=d:/temp-2017-02-23/exp_zjjj.dmp log=d:/temp-2017-02-23/imp_zjjj.log feedback=100000 buffer=524288000
3、檢查對象下表的具體行數
set serveroutput on size 1000000
set pages 50000
spool d:/temp-2017-02-23/xinku-zjjj.txt
DECLARE
v_cnt number;
BEGIN
FOR rec in (select 'ZJJJ.' || TABLE_NAME AS tanme from dba_tables where owner='ZJJJ' order by 1)
LOOP
execute immediate 'select count(*) from '||rec.tanme into v_cnt;
dbms_output.put_line(rpad(rec.tanme,40,'-')||v_cnt);
END LOOP;
END;
/
三、遷移數據進行對比部分:
進行導出文件d:/temp-2017-02-23/xinku-zjjj.txt 文件和導入文件d:/temp-2017-02-23/xinku-zjjj.txt 所有表行數的對比,確保無誤。
注意:為確保數據一致性,一定要對比導入和導出數據行數是否一樣,因為客戶公司都是證券,基金等,每一條數據都很重要。
4、檢查無效對象
--統計失效的對象:
select owner, object_type,status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type
--查看具體失效對象
col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;
--執行腳本編譯數據庫失效對象。
@$ORACLE_HOME/rdbms/admin/utlrp.sql
5、收集對象統計信息
--查看表統計信息是否過期:
exec dbms_stats.flush_database_monitoring_info;
select owner, table_name,object_type,num_rows,sample_size,trunc(sample_size / num_rows * 100) estimate_percent,stale_stats, last_analyzed
from dba_tab_statistics
where
--table_name in upper('t1') and
owner = upper('ZJJJ')
and (stale_stats = 'YES' or last_analyzed is null);
SELECT Table_Name,Num_Rows,Blocks,Empty_Blocks,Avg_Space,Chain_Cnt,Avg_Row_Len,Sample_Size,Last_Analyzed
FROM Dba_Tables WHERE owner = upper('ZJJJ');
--查看表的直方圖
select a.column_name,
b.num_rows,
a.num_distinct Cardinality,
round(a.num_distinct / b.num_rows * 100, 2) selectivity,
a.histogram,
a.num_buckets
from dba_tab_col_statistics a, dba_tables b
where a.owner = b.owner
and a.table_name = b.table_name
and a.owner = upper('ZJJJ');
--and a.table_name = upper('t1');
--對某一個schma收集統計信息
BEGIN
dbms_stats.gather_schema_stats(ownname=> 'ZJJJ',
estimate_percent => 100,
method_opt => 'for all columns size repeat',
no_invalidate => FALSE,
degree => 8,
cascade => TRUE);
END;
/
=============================================================
