ora-00257错误,以及oracle字符集

sqlplus /nolog

conn charge/charge

导致ora-00257错误一般都是归档日志存放目录已满,无法归档造成的。

// *Cause:  The archiver process received an error while trying to archive
//       a redo log.  If the problem is not resolved soon, the database
//       will stop executing transactions. The most likely cause of this
//       message is the destination device is out of space to store the
//       redo log file.
// *Action:  Check archiver trace file for a detailed description
//        of the problem. Also verify that the
//       device specified in the initialization parameter
//       ARCHIVE_LOG_DEST is set up properly for archiving

然后查看归档的存放目录:show parameter ARCHIVE_LOG_DEST

贴下我的参数:

NAME                                 TYPE        VALUE
———————————— ———– ——————————
audit_file_dest                      string      /app/oracle/admin/oradb/adump
background_dump_dest                 string      /app/oracle/admin/oradb/bdump
core_dump_dest                       string      /app/oracle/admin/oradb/cdump
db_create_file_dest                  string
db_create_online_log_dest_1          string
db_create_online_log_dest_2          string
db_create_online_log_dest_3          string
db_create_online_log_dest_4          string
db_create_online_log_dest_5          string
db_recovery_file_dest                string      /app/oracle/flash_recovery_are
a
db_recovery_file_dest_size           big integer 1G
log_archive_dest                     string
log_archive_dest_1                   string
log_archive_dest_10                  string
log_archive_dest_2                   string      SERVICE=oradg_172.16.3.174 ARC
H VALID_FOR=(ONLINE_LOGFILES,P
RIMARY_ROLE) DB_UNIQUE_NAME=or
adg

 

其实大家这里可以看到,我做了DG,本里的归档如果不配置log_archive_dest ,那么就是在db_recovery_file_dest ,而且我设置了1G,查看该目录:du -sh /app/oracle/flash_recovery_area/archivelog  用掉928M,那么立即删除归档日志,注意删除归档是要在RMAN删除,以下是删除步骤:

rman target /             —-连接

crosscheck archivelog all;          ——-检查无用归档日志

delete archivelog until time ‘sysdate-1’;  —————保留了最近一天的归档

SQL> select * from v$flash_recovery_area_usage;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
———— —————— ————————- —————
CONTROLFILE                   0                         0               0
ONLINELOG                     0                         0               0
ARCHIVELOG                    0                         0               0
BACKUPPIECE                1.14                       .57               2
IMAGECOPY                     0                         0               0
FLASHBACKLOG               7.42                      5.94               5
检查使用率

回复正常

下面说下oracle字符集:

首先怎么查看oracle字符集

1.select * from props$
where name in (‘NLS_LANGUAGE’, ‘NLS_TERRITORY’, ‘NLS_CHARACTERSET’,’NLS_NCHAR_CHARACTERSET’);
2.SELECT USERENV(‘LANGUAGE’) “Language” FROM DUAL;

这两种方法都可以查看

数据库系统字符集

NLS_LANG = language_territory.charset

它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。如:AMERICAN _ AMERICA. ZHS16GBK

字符集编码说明:

<Language><bit size><encoding>
即:  <语言>    <比特位数><编码>
比如: ZHS    · 16     ·GBK

以上都是服务端的字符集

下面是客户端的字符集:

如果linux,可以echo $NLS_LANG

windows下面是注册表里面,可以在注册表搜索一下NLS_LANG。

这里主要介绍一下dmp文件字符集修改:

exp/imp的时候相信大家经常遇到字符集的困扰,这里其实可以修改dmp文件的头部信息,和要导入的修改一致,一般也是可以的,其实就是绕过了oracle的检查。

dmp文件的第2第3字节记录了字符集信息,这样做理论理论上支持从子集到超集的修改,具体就是用UE打开DMP文件,找出2和3字节

select nls_charset_name(to_number(‘0354′,’xxxx’)) from dual;

如果dmp很大大家可以使用linux的命令cat 和awk的组合查看

select to_char(nls_charset_id(‘UTF8’), ‘xxxx’) from dual;

367

打开dmp文件修改相应的2和3字节,就可以了。

数据库字符集修改这里就不详解了,那玩意建库的时候注意点就可以了。没必要后面折腾。

标签