Oracle报错解决
1 ORA-00020
超出最大进程数
报错信息
ORA-00020: maximum number of processes (150) exceeded
查询当前默认配置的 process 是多少
常规方法无法登录,我们连接时候要加上-prelim
参数
$ sqlplus -prelim/ as sysdba
SQL> set linesize 500;
SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
gcs_server_processes integer 0
global_txn_processes integer 1
job_queue_processes integer 1000
log_archive_max_processes integer 4
processes integer 150
修改 processes 到500
SQL> alter system set processes=500 scope = spfile;
SQL> shutdown immediate;
SQL> startup
2 ORA-10458、ORA-01196、ORA-01110
Oracle DG 备库启动报错如下
ORA-10458: standby database requires recovery
ORA-01196: file 1 is inconsistent due to a failed media recovery session
ORA-01110: data file 1: '/oradata/orcl/datafile1/system01.dbf'
在备库执行
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database recover managed standby database using current logfile disconnect from session;
启动主库
在主库上切换日志
SQL> alter system switch logfile;
sql> select SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED, ARCHIVED from V$ARCHIVED_LOG order by FIRST_TIME;
如果返回结果APPLIED
都是YES
或者只有最后一个是NO
的话,说明全部归档日志全部已经归档完了
如果没有等待同步后再执行查询确认状态
此时到备库上上操作:
SQL> alter database recover managed standby database cancel;
SQL> alter database open;
SQL> alter database recover managed standby database using current logfile disconnect from session;
以上操作仍无法解决可能需要以下操作
2.0.1 手动归档
关闭主库shutdown immediate
拷贝归档日志到从库,并进行注册
SQL> alter database register physical logfile '/data/oracle/archivelog/1_758_991156185.dbf';
SQL> alter database register physical logfile '/data/oracle/archivelog/1_759_991156185.dbf';
重启主从(注意顺序)
2.0.2 复制密码文件
a) 关闭主库和备库:shutdown immediate
b) 将主库的密码文件复制到备库(在主库操作)
$ scp $ORACLE_HOME/dbs/orapworcl oracle@standbydb:$ORACLE_HOME/dbs/
3 ORA-16191
Primary log shipping client not logged on standby
问题解决方式其实很简单,在主库重新生成口令文件传到备库中即可。问题的主要思路还是要根据警告日志的内容做对应的排查。
3.0.3 复制密码文件
a) 关闭主库和备库:按照正常流程关闭
b) 将主库的密码文件复制到备库(在主库操作)
$ scp $ORACLE_HOME/dbs/orapworcl oracle@standbydb:$ORACLE_HOME/dbs/
4 ORA-01589
must use RESETLOGS or NORESETLOGS option for database open
表示数据库控制文件中存在重做日志的描述性信息与实际的重做日志文件不匹配。通常,这可能是由于控制文件或重做日志文件损坏引起的,这可能导致数据库无法正常启动。
原因:数据库服务器断电,导致数据库启动的时候报ORA-01589
但是使用 alter database open resetlogs
方式启动同样是无法启动。
可以通过设置_allow_resetlogs_corruption
隐藏参数
这是一个高风险操作,在没有其他选择的情况下可以这样配置。
sql> ALTER SYSTEM SET "_allow_resetlogs_corruption"=TRUE SCOPE=SPFILE;
sql> SHUTDOWN IMMEDIATE;
sql> STARTUP;
通过这个隐藏参数非常规恢复的库,原则建议还是要重建库的。在alert日志中也会看到有这样的建议:
RESETLOGS is being done without consistancy checks. This may result
in a corrupted database. The database should be recreated.
5 ORA-00823
Specified value of sga_target greater than sga_max_size
这个异常通常是因为改动了sga_max_size
或者sga_target
这两个参数值,导致sga_target
比sga_max_size
值大
create pfile='$ORACLE_HOME/dbs/init20231011.ora' from spfile;
修改init20231011.ora
中的sga_max_size
和sga_target
参数
sga_target
加pga_aggregate_target
之和不能超过系统共享内存(/dev/shm)
6 ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device Additional information: 2097152
$$ 32∗1024^3 bytes/4∗1024 bytes/page=8388608 页 $$kernel.shmall
通常应该设置为系统总内存的物理页数。由于Linux系统中默认的页大小是4KB,对于32GB内存(32 * 1024 MB),总的物理页数为:因此,推荐设置
kernel.shmall = 8388608
。kernel.shmmax
是单个共享内存段的最大大小,对于Oracle数据库或其他需要大量共享内存的应用,一般建议将其设置为系统内存的一个较大比例,但不超过系统内存的大小。一个常见的做法是将其设置为系统内存的一半或略低于一半,以确保有足够的共享内存空间同时不影响其他系统操作。对于32GB内存,一个合理的设置可能是16GB(即16 * 1024^3 字节)。所以,推荐设置
kernel.shmmax = 16777216000
(或16G
)
修改/etc/sysctl.conf
,添加
kernel.shmmax = 16777216000
kernel.shmall = 8388608
7 Oracle CPU占用率高排查
通过 top 获得占用率高的 pid,使用 pid 查询获得 addr
sql> select addr from v$process where spid=94499;
使用 addr 查询获得 sql_id
sql> select sql_id from v$session where paddr='000000008CCB5A70';
使用sql_id 获得具体 sql
sql> select * from v$sql where sql_id = '86bb6nk7x0bc2';