Oracle匯入字元集的問題

來源:互聯網
上載者:User

問題發現

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
/

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.