読者です 読者をやめる 読者になる 読者になる

Oracle11gXE SJIS化、impdp、他

Oracle DB

Oracle11gXEのインストールで作成されるDBはUTF-8です。
SJIS(JA16SJISTILDE)に変更する必要がありました。

環境

Windows7 64bit
Oracle11gXE

SJISへの変更

SQLコマンドラインの実行。

データベースをDROPします。

connect / as sysdba
SQL> shutdown immediate
SQL> startup restrict mount
SQL> drop database;
SQL> quit
環境変数ORACLE_HOMEの設定

環境変数ORACLE_HOMEをC:\oraclexe\app\oracle\product\11.2.0\serverにセット。

Oracleのサービスの停止

コントロールパネル→管理ツール→サービスを開き、「OracleServiceXE」を停止。

コマンドプロンプトを管理者権限で起動、コマンドの実行
>C:\oraclexe\app\oracle\product\11.2.0\server\bin\CreateDB.bat -dbchar JA16SJISTILDE

SJISのデータベースができました。

Oracleのサービスの開始

コントロールパネル→管理ツール→サービスを開き、「OracleServiceXE」を開始または再起動してください。

表領域、ユーザー、スキーマの作成

SQLコマンドラインの実行を起動。

connect / as sysdbaで接続、起動
SQL>startup
表領域の作成
SQL>create tablespace DATA_01 datafile 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\DATA_01.DBF' size 100m AUTOEXTEND ON NEXT 10M MAXSIZE 10000M;
SQL>create temporary tablespace TEMP_01 tempfile 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\TEMP_01.DBF' size 100m;
ユーザー・スキーマの作成
SQL>create user USER_1 identified by USER_1 default tablespace DATA_01 temporary tablespace TEMP_01 quota unlimited on DATA_01;
SQL>grant dba to USER_1;

impdpのためのディレクトリの作成

impdpにはディレクトリをインスタンスに作成する必要がある。インスタンスとDBの用語の使い分けは良くわかっていない

Windowsエクスプローラーでc:\tmpを作成し、中にDBのダンプファイルを配置
ディレクトリの作成
SQL>CREATE OR REPLACE DIRECTORY tmp AS 'c:\tmp';
SQL>grant read on directory tmp to USER_1;
SQL>grant write on directory tmp to USER_1;

xlsを製品版から持ってくる、読み込む

製品版から持ってくるかググるOracleディレクトリが全世界公開されているかわいそうなサーバーがあるのでそこから。
kualter.xslとかで検索する。
持ってきてC:\oraclexe\app\oracle\product\11.2.0\server\rdbms\xml配下に展開

SQL> execute sys.dbms_metadata_util.load_stylesheets;

impdp

コマンドプロンプトを管理者権限で開き

>impdp USER_1/USER_1 directory=tmp dumpfile=DB.DMP
とか
>impdp USER_1/USER_1 directory=tmp dumpfile=DB.DMP include=table:\"like \'M_%\'\"
とか
>impdp USER_1/USER_1 directory=tmp dumpfile=DB.DMP tables=USER_1.TABLE1
とか

XEのデータ容量上限を何とかするためのいろいろなコマンドとか

SQL>ALTER TABLESPACE DATA_01 COALESCE;
SQL>ALTER TABLE USER_1.TABLE1 enable row movement;
SQL>ALTER TABLE USER_1.TABLE1 SHRINK SPACE;
使用量を表示するSQLとか
select ddf.TABLESPACE_NAME,
ddf.BYTES,
ddf.BYTES-DFS.BYTES "BYTES_USED",
round(((ddf.BYTES-dfs.BYTES)/ddf.BYTES)*100,2) "PERCENT_USED",
dfs.BYTES "BYTES_FREE",
round((1-((ddf.BYTES-dfs.BYTES)/ddf.BYTES))*100,2) "PERCENT_FREE"
from (select TABLESPACE_NAME,
sum(BYTES) bytes
from dba_data_files
where autoextensible='NO'
group by TABLESPACE_NAME) ddf,
(select TABLESPACE_NAME,
sum(BYTES) bytes
from dba_free_space
group by TABLESPACE_NAME) dfs
where ddf.TABLESPACE_NAME=dfs.TABLESPACE_NAME
order by ((ddf.BYTES-dfs.BYTES)/ddf.BYTES) desc;
set linesize 1000
set pagesize 1000
col OWNER   format A20
col s_bytes format 999,999,999,999
select TABLESPACE_NAME,OWNER,sum(BYTES) s_bytes from dba_segments group by OWNER,TABLESPACE_NAME order by TABLESPACE_NAME,OWNER;
SELECT
table_name,
TO_NUMBER(
extractvalue(
xmltype(
dbms_xmlgen.getxml('SELECT COUNT(*) c FROM '||table_name))
,'/ROWSET/ROW/C')) rec_ccount,
trunc(bytes/1024,0) tablesize
FROM user_tables
join user_segments on user_segments.segment_name = user_tables.table_name
ORDER by tablesize asc;

startup

なお、データベースを作り直した後はWindows起動とともにインスタンスが起動することはなくなる。
Windows起動のたびにインスタンスを起動する必要がある。
やりかたはあるのだろうが、とりあえず。。
SQLコマンドラインの実行を起動し、
connect / as sysdbaで接続します。
startup
を行い、インスタンスを起動。

便利なツール

世の中にはダンプの中身を見れるツールが存在する「exde」だったかな。ダンプファイルの文字コードもそういうツールで調べる。

参考

インターネットをいろいろ検索した。