При инсталляции, редакция Oracle Database 11g Express Edition ставит базу данных с набором символов по умолчанию AL32UTF8. Это конечно сильно сокращает максимальный размер и так небольшого лимитируемого табличного пространства в 11 Гб. В данном NLS наборе для кодировки русских символов используется два байта:

SQL> SELECT DUMP('Я', 1017) FROM dual;
 
DUMP('Я',1017)                           
-----------------------------------------
Typ=96 Len=2 CharacterSet=AL32UTF8: d0,af

Приходится увеличивать вдвое размер символьных столбцов. Это в свою очередь ведёт к увеличению занятого табличного пространства и создаёт сложности в использовании утилит экспорта импорта при перекачке данных.

Если применять набор символов Unicode не планируется, то можно попробовать пересоздать базу данных в необходимой нам однобайтной кодировке. Посмотрим на примере, как это делается. Считаем, что Oracle Database 11g Express Edition у нас проинсталлирована по умолчанию.

Для начала установим переменную ORACLE_HOME и подключимся к экземпляру как sys:

C:\oraclexe\app\oracle>SET ORACLE_HOME=c:\oraclexe\app\oracle\product\11.2.0\server

C:\oraclexe\app\oracle>c:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus /nolog

SQL*Plus: Release 11.2.0.2.0 Production on ?э ?рЁ 26 22:03:46 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

SQL> connect sys as sysdba
Enter password:
Connected.

Остановим базу данных и снова её запустим, но уже в смонтированном монопольном режиме и с ограничением по подключению:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup restrict mount exclusive;
ORACLE instance started.

Total System Global Area  535662592 bytes
Fixed Size                  1384760 bytes
Variable Size             226496200 bytes
Database Buffers          301989888 bytes
Redo Buffers                5791744 bytes
Database mounted.

Теперь удалим базу данных:

SQL> drop database;

Database dropped.

Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 – Production

Старая база данных у нас удалена, можно приступать к созданию новой. Но прежде чем это сделать, проделаем два небольших действия.

Первое, это создадим или скопируем файл инициализационных параметров initXE.ora в каталог c:\oraclexe\app\oracle\product\11.2.0\server\database. Второе, скачаем этот архив и распакуем его в каталог C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\xml, зачем, об этом немного позже.

Все необходимые файлы скопированы, подключаемся к экземпляру и стартуем его с нашим файлом инициализации initXE.ora:

SQL> connect sys as sysdba
Enter password:
Connected to an idle instance.

SQL> startup nomount 
pfile=c:\oraclexe\app\oracle\product\11.2.0\server\database\initXE.ora
ORACLE instance started.

Total System Global Area  535662592 bytes
Fixed Size                  1384760 bytes
Variable Size             226496200 bytes
Database Buffers          301989888 bytes
Redo Buffers                5791744 bytes

Создаём базу данных следующей командой, указав в ней необходимый нам набор символов (строка character set cl8mswin1251):

SQL> create database
  2    maxinstances 1
  3    maxloghistory 2
  4    maxlogfiles 16
  5    maxlogmembers 2
  6    maxdatafiles 30
  7  datafile 'c:\oraclexe\app\oracle\oradata\XE\system.dbf'
  8    size 200M reuse autoextend on next 10M maxsize 600M
  9    extent management local
 10  sysaux datafile 'c:\oraclexe\app\oracle\oradata\XE\sysaux.dbf'
 11    size 10M reuse autoextend on next  10M
 12  default temporary tablespace temp tempfile 
'c:\oraclexe\app\oracle\oradata\XE\temp.dbf'
 13    size 20M reuse autoextend on next  10M maxsize 500M
 14  undo tablespace undotbs1 datafile 'c:\oraclexe\app\oracle\oradata\XE\undotbs1.dbf'
 15    size 50M reuse autoextend on next  5M maxsize 500M
 16   character set cl8mswin1251
 17   national character set al16utf16
 18   set time_zone='00:00'
 19   controlfile reuse
 20   logfile 'c:\oraclexe\app\oracle\oradata\XE\log1.dbf' size 50m reuse
 21         , 'c:\oraclexe\app\oracle\oradata\XE\log2.dbf' size 50m reuse
 22         , 'c:\oraclexe\app\oracle\oradata\XE\log3.dbf' size 50m reuse
 23  user system identified by oracle
 24  user sys identified by oracle
 25  /

Database created.

База данных в нужной нам кодировке создана. Добавим к ней табличное пространство USERS:

SQL> create tablespace users
  2    datafile 'c:\oraclexe\app\oracle\oradata\XE\users.dbf'
  3    size 100M reuse autoextend on next 10M maxsize 11G
  4    extent management local
  5  /

Tablespace created.

Запускаем на выполнение следующие скрипты:

-- Создаёт словарь базы данных
SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catalog.sql 

-- Создаёт дополнительные представления по блокировкам Oracle
SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catblock 

-- Создаёт дополнительные типы, таблицы, представления, процедуры, пакеты
SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catproc 

-- Создаёт объекты для поддержки криптографии 
SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\catoctk 

-- Создаёт таблицу PRODUCT_USER_PROFILE для SQL*Plus
SQL>@c:\oraclexe\app\oracle\product\11.2.0\server\sqlplus\admin\pupbld

Перезапускаем базу данных:

SQL> connect sys as sysdba
Enter password:
Connected.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup;
ORACLE instance started.

Total System Global Area  535662592 bytes
Fixed Size                  1384760 bytes
Variable Size             226496200 bytes
Database Buffers          301989888 bytes
Redo Buffers                5791744 bytes
Database mounted.
Database opened.

Смотрим значения параметров NLS базы данных:

SQL> SELECT * FROM NLS_DATABASE_PARAMETERS
 
PARAMETER               VALUE                       
----------------------- ----------------------------
NLS_LANGUAGE            AMERICAN                    
NLS_TERRITORY           AMERICA                     
NLS_CURRENCY            $                           
NLS_ISO_CURRENCY        AMERICA                     
NLS_NUMERIC_CHARACTERS  .,                          
NLS_CHARACTERSET        CL8MSWIN1251                
NLS_CALENDAR            GREGORIAN                   
NLS_DATE_FORMAT         DD-MON-RR                   
NLS_DATE_LANGUAGE       AMERICAN                    
NLS_SORT                BINARY                      
NLS_TIME_FORMAT         HH.MI.SSXFF AM              
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM    
NLS_TIME_TZ_FORMAT      HH.MI.SSXFF AM TZR          
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY       $                           
NLS_COMP                BINARY                      
NLS_LENGTH_SEMANTICS    BYTE                        
NLS_NCHAR_CONV_EXCP     FALSE                       
NLS_NCHAR_CHARACTERSET  AL16UTF16                   
NLS_RDBMS_VERSION       11.2.0.2.0                  

Как видим, созданная вновь база данных имеет однобайтовый набор символов (NLS_CHARACTERSET CL8MSWIN1251). Что нам и надо было получить.

Проверяем:

SQL> SELECT DUMP('Я', 1017) FROM dual;
 
DUMP('Я',1017)                            
------------------------------------------
Typ=96 Len=1 CharacterSet=CL8MSWIN1251: df

Напоследок хочется сказать о том, зачем надо было распаковывать файлы из архива xsl.rar в каталог C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\xml. Если это не сделать до выполнения скрипта catproc, то потом окажется, что утилита Oracle Data Pump Export (expdp) отказывается работать, выдавая ошибку:

Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
ORA-39006: internal error
ORA-39213: Metadata processing is not available

Если вы забыли скопировать файлы архива до выполнения скрипта, то ничего страшного, это можно сделать и позже. Единственное, надо не забыть выполнить после этого процедуру LOD_STYLESHEETS пакета DBMS_METADATA_UTIL:

SQL> exec dbms_metadata_util.load_stylesheets;
PL/SQL procedure successfully completed.

Комментарии   

#1 gee12 13.06.2019 14:19
Спасибо за мануал, то, что нужно было.

You have no rights to post comments