### 1、全局数据库名不对导致的错误:
**错误描述:**
```
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
```
SID表示全局数据库名,也就是在Oracle数据库安装过程中设置的数据库名称,一般默认orcl。但是我在安装Oracle数据库时,为了展现我高超的起名技巧,就没用默认数据库名,而设置成database(也不见得这起名技术有多高超,手动狗头),然后就在SSM项目的数据库连接池配置工程中踩坑了🤣。因为我忘记当时起的什么名字了。
**解决方法:**
如果你使用的是win server,直接去服务里找一个名为OracleService####的服务,其中####就是Oracle数据库的全局数据库名。

### 2、dmp文件导入出现的错误:
最近课题组接了一个高速公路相关的横向课题,想通过卡口数据推测车辆的行驶轨迹,交管部门只给了我们一个1G大小的dmp文件,说所有的数据都在这里边。嗨我这暴脾气,拿到dmp文件我啪的一下直接打开PL/SQL开始往数据库导入,很快哦。然而我大意了,事情并不像我想得那么简单。
#### 2.1、IMP-00010:不是有效的导出文件,标头验证失败

第一次导入时就报了这个错,于是就我在互联网上冲浪一番后得出两个结论:
- dmp文件的导出方Oracle数据库版本高于导入方Oracle数据版本
也就是说给我们dmp数据的部门,他们的Oracle版本高于11.2。
- dmp文件已经损坏
直觉告诉我问题肯定出在第一点上了。但是怎么知道dmp文件导出方的数据库版本呢?很简单啊当然是咨询给我们数据的交管部门啊。但是,从小接受的教育告诉我“自己动手,丰衣足食”,哪能遇见问题就咨询别人呢。
按理来说,dmp文件肯定包含Oracle版本号,打开dmp文件看一下不就知道了么。然而我有一次大意了。用我的EditPlus打开这个dmp文件时,由于文件太大了(接近1G)EditPlus无能为力。我不由得陷入了沉思,难道只能问给我们数据的交管部门了吗?呵,不可能,我最好找到了一款专门读写大文件的软件————UltraEdit ,于是下载、安装、打开一气呵成。打开dmp文件后果然不出我所料,导出方的Oracle数据库版本为12.2比我们的高。于是手动修改dmp文件的数据库版本号为11.2,这样就不会出现标头验证失败的错误了。

#### 2.2、表空间不足,导致数据导入程序闪退
在dmp导入之前,我专门创建了一个Oracle数据用户来维护这些数据,使用的默认表空间为SYSTEM,临时表空间为TEMP。但是SYSTEM的表空间容量之前已经使用了80%左右,剩余容量并不足以放下这个dmp文件中的数据,从而导致数据导入程序直接闪退。查看表空间容量使用情况的方法如下:
```SQL
SELECT TABLESPACE_NAME "表空间",
To_char(Round(BYTES / 1024, 2), '99990.00')
|| '' "实有",
To_char(Round(FREE / 1024, 2), '99990.00')
|| 'G' "现有",
To_char(Round(( BYTES - FREE ) / 1024, 2), '99990.00')
|| 'G' "使用",
To_char(Round(10000 * USED / BYTES) / 100, '99990.00')
|| '%' "比例"
FROM (SELECT A.TABLESPACE_NAME TABLESPACE_NAME,
Floor(A.BYTES / ( 1024 * 1024 )) BYTES,
Floor(B.FREE / ( 1024 * 1024 )) FREE,
Floor(( A.BYTES - B.FREE ) / ( 1024 * 1024 )) USED
FROM (SELECT TABLESPACE_NAME TABLESPACE_NAME,
Sum(BYTES) BYTES
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME TABLESPACE_NAME,
Sum(BYTES) FREE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) B
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME)
--WHERE TABLESPACE_NAME LIKE 'CDR%' --这一句用于指定表空间名称
ORDER BY Floor(10000 * USED / BYTES) DESC;
```
解决这个问题方式很简单,就是制定表空间的扩容策略。常见的方式有两种:
- 设置表空间的.DBF文件自增长。例如当表空间SYSTEM的SYSTEM.DBF文件容量不足时每次增长1G。
- 为一个表空间设置多个.DBF文件。例如当表空间SYSTEM的SYSTEM.DBF文件容量不足时直接替换为另一个SYSTEM01.DBF文件
个人推荐使用第二种方式,因为在不同操作系统的文件系统中单个文件的大小会受到限制。当使用第一种方式时,.DBF文件自增长到一定大小后就不能继续增长下去了。
设置第一种方式的方法如下:
```SQL
ALTER DATABASE DATAFILE 'Install_path\ORADATA\DATABASE\SYSTEM01.DBF'
AUTOEXTEND ON NEXT 1024M MAXSIZE 20480M;
```
设置第二种方式的方法如下:
```SQL
ALTER TABLESPACE SYSTEM ADD DATAFILE
'Install_path\ORADATA\DATABASE\SYSTEM_02.DBF'
size 7167M autoextend on ;
ALTER TABLESPACE SYSTEM ADD DATAFILE
'Install_path\ORADATA\DATABASE\SYSTEM_03.DBF'
size 7167M autoextend on ;
```
至此,所有导入问题都已解决,导入成功了。去数据库查了一下,发现原来有300w条数据左右,恐怖。


Oracle数据库排坑记