【已解决】ORACLE 数据导入、连接等问题问题汇总

目录

问题一:ORA-31684: 对象类型 xxxx 已存在 table_exists_action xxxxx

问题二: 从源数据库expdp导出数据,然后往目标数据库impdp导入的时候报错

问题三   Oracle报错ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展

 问题四:Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack

修改连接数的限制


 

 


问题一:ORA-31684: 对象类型 xxxx 已存在 table_exists_action xxxxx

解决方法:在impdb 导入时 加入参数   table_exists_action=replace      意思是如果表存在就替换。


问题二: 从源数据库expdp导出数据,然后往目标数据库impdp导入的时候报错

ORA-02374: conversion error loading table "xxxx"."xxxxxx"
ORA-128da99: value too large for column xxxxxxx (actual: 124, maximum: 100)

 分析:

    源数据库字符集: zhsgbk16

    目标端数据库字符集:al32utf8

    zhsgbk16 和 utf8 对数据编码之后,存储格式不同,对于中文来讲,gbk存放一个汉字占用2个字节,utf8存放一个汉字占用3个字节,这样就会导致,

     比方说:原先GBK字符编码的数据库中的某张表中,存放中文的字段:colum001的类型是varchar 长度为200 ,并且该字段的大多数行的现有数据长度基本上在180个字节,那么该表导入UTF8编码的数据库中时,该字段原先存储的大多数180个字节的汉字,就需要180*3/2=270个字节左右的字符长度才能正常存放;而此时在执行impdp导入操作的时候,表结构是不会改变的,也就是原先的字段定义colum001的长度还是保持着200,因此在导入的时候,就会报错,出现上述错误信息。

解决方法:

第一种:重新导出,导入

在源库执行导出操作之前,把qbjmes.project 字段改成超过103  。

然后再往目标库导入的时候,就不会报错了。

第二种:清空报错表的数据,修改相关字段的长度,然后重新导入只导入该表的数据。

truncate table V_PS_STAFFPOS_REPTO_PUB_MT;

alter table V_PS_STAFFPOS_REPTO_PUB_MT modify(POST_NAME VARCHAR2(60));

然后再重新导入(只导入数据)。

第三种:如果不想改变目标端数据库的字符集,那么修改源数据库字符集(更改数据库字符集的操作不建议使用),然后执行重新导出操作,详细的步骤如下:


SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP MOUNT EXCLUSIVE;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SQL>SHUTDOWN immediate;
SQL>startup;

问题三   Oracle报错ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展

ORA-39171: 作业出现可恢复的等待。
ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展

查看表空间,发现表空间大小已达到32G,但创建表空间时已设置了无限扩展(impdb  导入数据时,dump文件有16G;初始空间为19G),磁盘空间没满,说明表空间无法进行自动扩展了。

单个表空间数据文件的最大值为:
最大数据块 * DB_BLOCK_SIZE

查看Oracle的 DB_BLOCK_SIZE

SQL> select value from v$parameter where name ='db_block_size';

      结果为:8192

本机数据库的数据块大小为8K,算出本机Oracle 单个表空间数据文件的最大值为:
4194304 * 8/1024 = 32768M (32G)

所以既使创建表空间时设置了 autoextend on maxsize unlimited,其最大空间也是不会超过32G。

注:
表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定。DB_BLOCK_SIZE参数可以设置为4K、8K、16K、32K、64K等几种,Oracle的物理文件最大只允许4194304个数据块(这个参数具体由操作系统决定,一般应该是此数字),表空间数据文件的最大值对应关系就可以通过4194304×DB_BLOCK_SIZE/1024M计算得出。
4k最大表空间为:16384M

8K最大表空间为:32768M

16k最大表空间为:65536M

32K最大表空间为:131072M

64k最大表空间为:262144M

而Oracle默认分配的为8K,也就是对应于32768M左右的空间大小,如果想继续增大表空间的话,只需要通过alter tablespace name add datafile ‘path/file_name’ size 1024M;添加数据文件的方式就可以了。

数据块是oracle中最小的空间分配单位,各种操作的数据就的放在这里,oracle从磁盘读写的也是块。一旦create database,db_block_size就是不可更改的。因为oracle是以块为单位存储数据的,任何一个存储元素最少占用一个块,如果你改变了db_block_size,必然导致部分块不能正常使用。

其实在unix类操作系统中,文件块和oracle块的关系非常紧密(建议相等),这样才能保证数据库的执行效率。在windows下可能就不这么讲究了。建议使用8k以上的块,有人做过测试,同样的配置,8k的块比4k快大约40%,比2k快3倍以上。

解决方法:

处理方法两种:①假如当前表空间只有一个数据文件,可以扩大该数据文件的大小(单个数据文件最大32G,如果超出32G需,需要当前表空间添加1个或者多个数据文件,及第中方法);②为当前表空间新增数据文件。

为当前表空间新增数据文件方法如下:

在命令行下,以oracle系统管理员用户登录oracle,再执行以下操作:

1)方法一:分步骤。为指定的表空间增加数据文件(2步骤)
①为指定的表空间创建数据文件,并指定初始大小
ALTER TABLESPACE 表空间名称
ADD DATAFILE 'D:\Oracle\app\Administrator\oradata\orcl\新数据文件名称.DBF'
SIZE 32M;

② 为该数据文件打开自动增长,并指定每次自动增长的大小

ALTER DATABASE DATAFILE 'D:\Oracle\app\Administrator\oradata\orcl\新数据文件名称.DBF' AUTOEXTEND ON NEXT 200M ;

2)方法二:一步到位。为指定的表空间增加数据文件(一步到位:指定初始大小,打开自动增长,设置每次自动增长的大小)
ALTER TABLESPACE 表空间名称 ADD DATAFILE 'D:\app\Administrator\oradata\ORCL\DATAFILE\新数据文件名称.DBF' SIZE 10240M AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED;

 问题四:Oracle报错ORA-12516 TNS:listener could not find available handler with matching protocol stack

出现错误场景:通常是由于很多人或者很多应用(java应用、R应用等)连接数据库,导致连接数(session)数量超出限制。

解决办法

定位原因


-- 以sysdba身份登陆PL/SQL 
sqlplus / as sysdba;
-- 命令行下设置行大小,方便查看执行结果
setline 1000;

-- 查看当前连接进程数
SQL>select count(*) from v$process;
-- 查看连接数上限
SQL>select value from v$parameter where name = 'processes';
-- 查询processes数量
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 0
db_writer_processes integer 3
gcs_server_processes integer 0
job_queue_processes integer 10
log_archive_max_processes integer 2
processes integer 150
-- 查询sessions数量
SQL> show parameter sessions
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_max_sessionspace_size integer 0
java_soft_sessionspace_limit integer 0
license_max_sessions integer 0
license_sessions_warning integer 0
logmnr_max_persistent_sessions integer 1
sessions integer 170
shared_server_sessions integer
SQL>
  • 经过以上数据库参数查询,发现sessions数量不够,只有150,故增大sessions数量。
  • 只要会话连接数超过上面的process数150或者sessions数170,再来一个的会话进程,就会产生12516错误。因此可以修改一下该值。sessions和processes关系必须按照如下关系设置。
    sessions=1.1*processes+5;  //这个是sessions值和processes值的关系,最好按照这样做,因此如果要将processes数设置为500,则sessions数必须为1.1*500+5=555

修改连接数的限制

 -- 以sysdba身份登陆PL/SQL 
 -- 查询目前连接数
    show parameter processes;
 -- 修改processes
    alter system set processes=500 scope=spfile;
 -- 修改processes
    alter system set sessions=555 scope=spfile;
 -- 重启Oracle服务或重启Oracle服务器

 -- 然后reboot数据库,使其生效
     -- 关闭数据库
        shutdown immediate;
     -- 启动数据库
        startup

猜你喜欢

转载自blog.csdn.net/yy4545/article/details/108095186