Oracle报错解决

注意
本文最后更新于 2023-10-12,文中内容可能已过时。

摘要

超出最大进程数

报错信息

1
ORA-00020: maximum number of processes (150) exceeded

查询当前默认配置的 process 是多少

常规方法无法登录,我们连接时候要加上-prelim参数

1
$ sqlplus -prelim/ as sysdba
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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

1
2
3
SQL> alter system set processes=500 scope = spfile;
SQL> shutdown immediate;
SQL> startup

Oracle DG 备库启动报错如下

1
2
3
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'

在备库执行

1
2
3
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database recover managed standby database using current logfile disconnect from session;

启动主库

在主库上切换日志

1
2
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的话,说明全部归档日志全部已经归档完了

如果没有等待同步后再执行查询确认状态

此时到备库上上操作:

1
2
3
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;

以上操作仍无法解决可能需要以下操作

关闭主库shutdown immediate

拷贝归档日志到从库,并进行注册

1
2
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';

重启主从(注意顺序)

a) 关闭主库和备库:shutdown immediate

b) 将主库的密码文件复制到备库(在主库操作)

1
$ scp $ORACLE_HOME/dbs/orapworcl oracle@standbydb:$ORACLE_HOME/dbs/

Primary log shipping client not logged on standby

问题解决方式其实很简单,在主库重新生成口令文件传到备库中即可。问题的主要思路还是要根据警告日志的内容做对应的排查。

a) 关闭主库和备库:按照正常流程关闭

b) 将主库的密码文件复制到备库(在主库操作)

1
$ scp $ORACLE_HOME/dbs/orapworcl oracle@standbydb:$ORACLE_HOME/dbs/

修改系统参数/etc/sysctl.conf

1
kernel.shmmax = 4294967296

单位是字节 (bytes)

使其生效

1
sysctl -p

must use RESETLOGS or NORESETLOGS option for database open

表示数据库控制文件中存在重做日志的描述性信息与实际的重做日志文件不匹配。通常,这可能是由于控制文件或重做日志文件损坏引起的,这可能导致数据库无法正常启动。

原因:数据库服务器断电,导致数据库启动的时候报ORA-01589

但是使用 alter database open resetlogs方式启动同样是无法启动。

可以通过设置_allow_resetlogs_corruption隐藏参数

这是一个高风险操作,在没有其他选择的情况下可以这样配置。

1
2
3
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.

Specified value of sga_target greater than sga_max_size

这个异常通常是因为改动了sga_max_size或者sga_target这两个参数值,导致sga_targetsga_max_size值大

1
create pfile='$ORACLE_HOME/dbs/init20231011.ora' from spfile;

修改init20231011.ora中的sga_max_sizesga_target参数

sga_targetpga_aggregate_target之和不能超过系统共享内存(/dev/shm)

通过 top 获得占用率高的 pid,使用 pid 查询获得 addr

1
sql> select addr from v$process where spid=94499;

使用 addr 查询获得 sql_id

1
sql> select sql_id from v$session where paddr='000000008CCB5A70';

使用sql_id 获得具体 sql

1
sql> select * from v$sql where sql_id = '86bb6nk7x0bc2';

相关内容