問題發現
6月24日下午,發現A地用戶端程式插入資料出錯,經查實,原因為表B的約束變成了“?”,因為裡面有中文字元,但是表裡的資料沒有亂碼。當天下午在伺服器上遠處控制,又讓匯出了一份,並匯入。仍然不行,按照網上的方法,改匯出dmp的2、3位元組為03 54,仍然不行,把遠處的資料導到本地再導回去的時候,因為網路問題不能匯入。單導到本地測試庫的時候可以。懷疑是對方作業系統的問題,因為兩邊資料庫字元集一樣,作業系統不同。當修改作業系統字元集再重啟的時候遠處系統就起不來了。
6月25日上午,在A地發現對方伺服器因為記憶體問題沒有啟動。啟動後,根據師兄的建議就用正式庫來做培訓,把正式庫的資料先導一份,培訓完後再導回去。
中午試著匯入的時候依然沒有解決問題,下午問了師兄,告訴了方法。匯出的時候要用export設字元集
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG
這個不用重啟,可能是我們作業系統字元集還是有問題。然後他解釋了原因,因為在資料庫裡面,表資料是用密文存放,不會有亂碼問題,但約束觸發器裡內容用明文存放,匯出的時候經過作業系統這一關,如果作業系統因為字元集的問題不認識那個字,就用?代替了。但是由於昨天導的資料是對的,表結構是錯的,而今天可以導正確的表結構,所以還是不好辦。
晚上回來的時候先導表結構(rows=n),再導資料(ignore=y),但發現匯入的資料不完整。據師兄說,Oracle匯入的時候是先導約束、再導資料,如果有約束了,而匯入資料的順序系統估計是用字典序,肯定對於有外碼的資料而言就不對。因此只有先導資料,再去掉所有的約束,預存程序、函數、視圖(如果已經有了,就不會再到匯入了),再導正確的表結構。參照附2、附3刪去了這些對象,但發現還有幾個預存程序、視圖沒有刪掉,原因不明,手動刪掉後再次匯入表結構就成功了。
附:
1、建使用者的語句
drop user userid cascade;
create user userid identified by "password" default tablespace "USERID" temporary tablespace "TEMP";
grant dba to userid;
grant connect to userid;
2、刪掉所有約束
set feedback off
set verify off
set echo off
prompt Finding constraints to disable...
set termout off
set pages 80
set heading off
set linesize 120
spool tmp_disable.sql
select 'spool igen_disable.log;' from dual;
select 'ALTER TABLE '||substr(c.table_name,1,35)||
' DROP CONSTRAINT '||constraint_name||' ;'
from user_constraints c, user_tables u
where c.table_name = u.table_name;
select 'exit;' from dual;
set termout on
prompt Disabling constraints now...
set termout off
@tmp_disable.sql;
exit
/
3、刪除所有觸發器、預存程序、函數、視圖,
spool dropobjects.sql
select 'drop trigger '||trigger_name||' ;' from user_triggers;
select 'drop procedure '||object_name||' ;' from user_procedures;
select 'drop function '||object_name||' ;' from user_procedures;
select 'drop view '||view_name||' ;' from user_views;
spool off
@ dropobjects.sql
4、啟用所有約束
set feedback off
set verify off
set wrap off
set echo off
prompt Finding constraints to enable...
set termout off
set lines 120
set heading off
spool tmp_enable.sql
select 'spool igen_enable.log;' from dual;
select 'ALTER TABLE '||substr(c.table_name,1,35)||
' ENABLE CONSTRAINT '||constraint_name||' ;'
from user_constraints c, user_tables u
where c.table_name = u.table_name;
/
select 'exit;' from dual;
set termout on
prompt Enabling constraints now...
set termout off
@tmp_enable;
!rm -i tmp_enable.sql;
exit
/