Fork me on GitHub

Oracle 十全大补汤

安装卸载

安装

新手不建议安装发布不久的最新版本,一来新版本可能有一些新特性,但是网上相关的文章较少,入坑概率很大,老手尚需时间来适应,新手肯定更觉得难以上手了;二来旧版本相对比较稳定,各种文档丰富,常见BUG都有比较成熟的应对方法;三是要看使用环境了,兼容性是考虑重点,客户端和服务器端版本要尽量一致,这里的问题实在太多,几百M都讲不完,说多了都是眼泪。

Oracle下载地址:【英文地址】【中文地址】

Windows下安装教程 Oracle 12c Windows安装、介绍及简单使用(图文)

  • 网上这个教程以Oracle 12c为例,其他版本安装过程都差不多,注意安装位置自己设置一下(只要设置Oracle基目录即可,其他目录会相应改变),字符集选UTF-8

Linux下安装教程:todo

安装过程中出现的问题

  • win10 下安装Oracle 11g(问题:环境不满足最低要求)

  • 先决条件检查有失败内容

    查看失败内容,如果是“预期值:N/A,实际值:N/A”这样的,是因为操作系统未开启默认共享,导致Oracle无法检查环境的可用性 ,这种情况直接点击右上角的全部忽略,就可以进行下一步安装了;如果确实某方面配置不达标,就不建议继续安装了,装个PL/SQL连服务器上的库玩就好了。

卸载

新手导错库或者初始化配置错误不知道还原的方法怎么办,简单,卸载重装。^_^ 装装卸卸多了,就变成熟手了。这个有现成的教程,亲测好用:

Windows下卸载彻底的卸载干净oracle 11g

Linux下卸载:todo

常用目录结构

了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率 。这里以oracle 11g为例。

.                                   # 主目录
│─ cfgtoollogs                       # 存放当运行dbcadbuaemcanetca等图形化配置程序时的log
│─ flash_recovery_area                  # 存储并管理与备份和恢复有关的文件
│─ oradata                              # 数据库文件缺省存储目录
   │─ dbf文件                        # 对应数据库中每个表空间
   │─ ctl文件                          # 控制文件
   └─ log文件                          # 对应重做日志文件组及其成员
└─ product                              # 客户端主目录
    └─ 11.2.0\dbhome_1
            │─ bin                  # 主要包含用于数据库管理的各种命令
            │─ css                  # Oracle Cluster Synchronization服务有关的文件
            │─ database
               └─ SPFILEORCL.ORA   # 服务器参数文件
            │─ dbs                    # 存放数据库服务器端的参数文件Spfile
            │─ demo                   # 存放数据库实例模式的脚本等
            │─ install              # 用于存储ORACLE安装后的端口号,iSQL*Plus以及Enterprise Manager Database Control启动并登录的方式等,如该路径下的portlist.ini
            │─ network/admin            # 有关监听器listener.ora和sqlnet.ora以及tnsnames.ora等
            └─ sysman/config            # 用于与Oracle Enterprise Management有关的端口管理等
                └─emkey.ora         # 加密密钥

监听/别名配置

Oracle只有在服务器端配置监听是必须的,在客户端可以不用配置;而且一般服务器端都是监听本地,默认配置都有,不需要另外配置;只有监听其他地址才需要另外配置。网上很多配置监听的教程都是修改\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\目录下tnsname.ora文件 ,其实是错误的,监听配置文件是同一目录下listener.ora文件,下面三篇文章感觉写的比较深入,但没有具体实践对比过。

那么tnsname.ora文件是做什么用的呢,其实这是别名配置文件,类似于hosts文件,提供tnsname到主机名或者ip的对应。

配置监听和别名的格式是一样的,添加如下:

TEST =                                                              --别名
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1 )(PORT = 1521))  --地址及端口号
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)                                         --实例名称
    )
  )

cmd命令

前提是本地安装了Oracle客户端,打开cmd,输入命令。由于帮助文档是中文的,所以不展开。

  • tnsping:诊断连接,查看帮助tnsping,地址可以使用别名。

  • exp:导出,查看帮助EXP HELP=Y,具体参见数据库迁移内容。

  • imp:导入,查看帮助IMP HELP=Y,具体参见数据库迁移内容。

  • sqlplus:链接,查看版本及帮助sqlplus -H。链接成功后命令提示符变成SQL>,此后可以输入正常SQL语句,记得句末带;,正常退出使用quit,其他输错密码或陷入不可描述状态退出可使用Ctrl+C,或者直接关闭终端。

其他命令还有很多,都在\oracle\product\11.2.0\dbhome_1\BIN\目录下,Windows下可执行命令为exe文件。

数据库初始化

数据库初始化主要分三步:创建表空间,建立用户和用户授权。

创建表空间

在创建表空间之前,首先要知道什么是表空间,并且要清楚临时表空间、永久表空间、默认表空间、UNDO表空间之间的区别,这里有几篇文章可以好好看下:

概念掌握之后,在实际创建表空间之前,最好先查询一下,确保要使用的名称没有被使用:

--查看已有的表空间
SELECT * FROM v$tablespace;

--查看详细数据文件
SELECT file_name,tablespace_name FROM dba_data_files;

--查看表空间使用情况
SELECT A.TABLESPACE_NAME                     AS TABLESPACE_NAME, 
        ROUND(A.BYTES/(1024*1024*1024),2)    AS "TOTAL(G)"     , 
        ROUND(B.BYTES/(1024*1024*1024),2)    AS "USED(G)"      , 
        ROUND(C.BYTES/(1024*1024*1024),2)    AS "FREE(G)"      , 
        ROUND((B.BYTES * 100) / A.BYTES,2)   AS "% USED"       , 
        ROUND((C.BYTES * 100) / A.BYTES,2)   AS "% FREE" 
FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C 
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME 
AND A.TABLESPACE_NAME = C.TABLESPACE_NAME;

要创建表空间,首先要使用有CREATE TABLESPACE权限的用户,创建表空间语法如下:

CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace_name
DATAFILE datafile spec | TEMPFILE tempfile spec
[MINIMUM EXTENT minimum extent size]
[BLOCKSIZE blocksize]
[[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)]
[LOGGING|NOLOGGING]
[FORCE LOGGING]
[ONLINE|OFFLINE]
[EXTENT MANAGEMENT DICTIONARY|LOCAL [AUTOALLOCATE|UNIFORM SIZE size]]
[SEGMENT SPACE MANAGEMENT MANUAL|AUTO]
[FLASHBACK ON|OFF]

语法看起来有点复杂,但是实际应用中并不是每个选项都需要配置,你只需知道能配置哪些就好,下面举一些栗子:

--创建临时表空间
CREATE TEMPORARY TABLESPACE TEMP 
TEMPFILE '/u02/oradata/temp.dbf' 
SIZE 50m 
AUTOEXTEND ON 
NEXT 50m MAXSIZE 20480m 
EXTENT MANAGEMENT LOCAL;

--创建单个表空间    
CREATE TABLESPACE TEST                                  --名称
  DATAFILE 'd:\work\oracle\oradata\test\TEST.DBF'       --存储位置
  SIZE 2048M                                            --初始大小
  AUTOEXTEND ON                                         --自动增长
  NEXT 32M MAXSIZE UNLIMITED                           --每次递增32M
  EXTENT MANAGEMENT LOCAL;                              --本地管理

--创建多个表空间        
CREATE TABLESPACE TS_IMAGEDATA
LOGGING
DATAFILE  'E:"ORACLE"ORADATA"DATA_01.DBF'  SIZE 2000M REUSE    
                AUTOEXTEND ON    
                NEXT 51200K MAXSIZE 3900M,    
          'E:"ORACLE"ORADATA"XL"DATA_02.DBF'  SIZE 2000M REUSE    
                AUTOEXTEND ON    
                NEXT 51200K MAXSIZE 3900M,    
          'E:"ORACLE"ORADATA"XL"DATA_03.DBF'  SIZE 2000M REUSE    
                AUTOEXTEND ON    
                NEXT 51200K MAXSIZE 3900M,    
          'E:"ORACLE"ORADATA"XL"DATA_04.DBF'  SIZE 2000M REUSE    
                AUTOEXTEND ON    
                NEXT 51200K MAXSIZE 3900M    
EXTENT MANAGEMENT LOCAL    
SEGMENT SPACE MANAGEMENT AUTO;

--创建UNDO表空间       
CREATE UNDO TABLESPACE ts_undo01    
      DATAFILE '/data/ts_undo01.dbf'      
      SIZE 50000M REUSE    
      AUTOEXTEND ON;

建立用户

在建立用户之前,最好也先查询一下:

SELECT username FROM dba_users;

建立用户当然也要使用有建立用户权限的账户,语法

实例:创建一个名为maxsu的新用户,密码passwd1234,默认表空间为tbs_perm_01,配额为20MB,使用tbs_temp_01 临时表空间。

CREATE USER maxsu
  IDENTIFIED BY passwd1234
  DEFAULT TABLESPACE tbs_perm_01
  TEMPORARY TABLESPACE tbs_temp_01
  QUOTA 20M ON tbs_perm_01;

Oracle12中建立本地用户需要在用户名前加C##,我试用了一下就卸载了。T_T

授权用户

当然首先了解下用户权限相关概念,初始化这里的授权一般只是授予用户的系统权限。

系统权限分为:

  • DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。(此权限慎授
  • RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
  • CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。

系统权限只能由DBA用户授出或收回:sys, system(最开始只能是这两个用户)

普通用户通过授权可以具有与system相同的用户权限,但永远不能达到与sys用户相同的权限,system用户的权限也可以被回收。

语法

--系统权限授权
GRANT CONNECT, RESOURCE, DBA TO user1 [,user2]...;

--系统权限传递:增加WITH ADMIN OPTION选项,则得到的权限可以传递。
GRANT CONNECT, RESOURCE TO user1 WITH ADMIN OPTION;

--系统权限回收
REVOKE CONNECT, RESOURCE FROM user1;

删除表空间和用户

--删除表空间
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;

--删除用户:加上CASCADE则将用户连同其创建的东西全部删除
DROP USER user_name CASCADE;

导出/导入数据

前提:我们导出/导入数据,肯定是要通过Oracle自带的可执行程序来完成数据的导入导出工作,所以要安装Oracle客户端;同时导出/导入的用户必须要有导出/导入的权限才行。

导出/导入一般有两种方法:

1. 以cmd命令操作符导入导出

导出/导入的基本语法如下:

EXP user/passwd@dbname KEYWORD=value...
IMP user/passwd@dbname KEYWORD=value...

具体的KEYWORD可以通过EXP/IMP HELP=Y查看,这里有几个注意事项:

  • @dbname为实例名称,远程服务器一般是@IP/实例名,本地可以省略IP,可以使用别名。

  • full=y表示全库(是整个数据库)导出/导入(慎用!),这个需要有DBA权限的用户,如果只要导出某个用户的所有数据,请不要加上full=y

  • 如果导入的表已经存在,直接导入会报错,加上ignore=y,对该表就不进行导入 ;如果是表数据不全,可以删掉该表再加上关键字tables=...重新导入。
  • 如果使用sys账户链接导出某个用户数据,使用exp "'sys/passwd@orcl as SYSDBA'" file=d:\test.dmp owner=ts,注意"'sys/passwd@orcl as SYSDBA'"这里用了两组引号,如果只用一组引号,需要用\转义:exp \"sys/passwd@orcl as SYSDBA\" file=d:\test.dmp owner=ts
  • 如果使用KEYWORD=(value1,value2,...,valueN),括号也需要转义:KEYWORD=\(value1,value2,...,valueN\)
  • 上述2点其实就是括号和引号需要转义。
  • 如果导入的用户和导出的用户不一致,记得加上fromusertouser
  • 导出/导入最好最好加上log选项,方便查看过程中遇到的错误,如果有哪张表有问题,可以另外单独处理。最可怕的就是你不知道库没导全。

2. 用PL/SQL Developer工具导出/导入

PL/SQL连上数据库后,也可以进行数据库的导出/导入,但是这里要注意PL/SQL的导出有两部分内容:

  • tools->export user objects:导出的.sql文件是建表语句(包括存储结构、函数、包等内容,不包含表数据不包含dblink
  • tools->export tables:导出的是表结构和表数据(只有表,不包含其他内容)

注意导出时要选择导出的用户。

所以要完整的导出用户数据,必须将user objects和tables都导出;完整的导入先导入user objects,再导入tables,如果还有dblink,需要手动复制粘贴导入(需要dblink链接的数据库密码)。

PL/SQL export tables有三种方式:

  • Oracle导出:其实就是用Oracle客户端的EXP导出,跟cmd导出指定表是一样的,只是不用输命令,但是这里只能用本地客户端的EXP命令,如果本地Oracle版本和服务器版本不一致,可能会有兼容性问题。

  • SQL插入:导出的是SQL语句,通用性比较好,方便查看或修改。缺点是日志要全部导出操作完成才能查看,如果表数据量大会有卡死的错觉;而且效率似乎比用EXP低,适合小数据量导入导出。勾选删掉表选项,导入时会在插入表数据前先删掉表,然后重建表插入数据,好处就是如果已存在的表有数据就会直接替换掉。

    如果表包含有CLOB等类型字段的话,是无法导出sql文件的。导出时会有报错提示,可以把这个表单独拿出来用Oracle导出

  • PL/SQL Developer:用PL/SQL自带工具导出/导入,导出为.pde格式 ,效率最低(没试过),好处是不需要安装客户端,应该适合少量数据。

总结

从效率上来说,用EXP/IMP最好,最好的导出/导入方法是在服务器本地导出/导入,这样的好处一是导出/导入的客户端版本和服务器版本一致,不存在兼容性问题(只是单纯的导出或者导入操作不存在兼容性问题,如果导出的服务器和导入的服务器版本不一致,还是有可能有兼容性问题);二是服务器本地导出速度更快;三是个人电脑关机不影响服务器操作。而且使用EXP/IMP比较方便,一个命令就解决了,但是遇到兼容性问题不太好处理。

从通用性来说,用PL/SQL的SQL插入比较好,而且不容易出现兼容性问题,即使出现了,直接修改SQL语句也比较方便。但是使用PL/SQL容易导不全,需要仔细检查。

如果数据量大的话,建议不要一次性导出/导入,分开导出/导入更安全。

数据导出/导入完整流程

  1. 了解要导出和导入的数据库情况,包括Oracle版本,用户权限,需要导出的数据的大致大小,有无特殊数据类型,有没有依赖其他库的东西,dblink链接密码等,要是能确定具体导哪些表哪些存储过程最好,这样一是导出数据量比较小,二是可以排除其他无效数据的影响;
  2. 导出时对照HELP文档检查导出语句,确保需要配置的KEYWORD都有且正确,记得加上日志选项,导出完毕查看日志,若有报错可能需要单独处理;
  3. 导入时按照上面初始化内容:建立表空间,建立用户并授权,检查导入语句正确无误后开始执行导入,若导入的用户名和导出的用户名不一致,需要加上fromusertouser;导入完毕查看日志,若有报错可能需要单独处理;
  4. 检查数据是否正确导入,是否有遗漏项;没有问题后编译无效对象,PL/SQL有个按钮直接就能执行,编译完毕后如果仍存在无效对象,检查原库对象是否有效,若是也无效就不用管了(毕竟可能有一些遗留问题),否则需要排查问题;
  5. 整理导出导入过程相关资料,这样下一次重复工作就变得简单了。

曾经遇到的问题

  • 导出报错:数据库链接口令无效

    数据库链接指的就是dblink,这个问题只发生在EXP下,一般是导出客户端版本低于服务器端,解决方法一是在服务器本地导出避开兼容性问题;二是另外备份好dblink,删除后再导出,导出后记得恢复。

  • 错误使用full=y导出:导入时各种报错

    这个只有新手才会犯的错误,搞清楚概念就不会发生了。

OEM创建

todo

question 1:oem是个what?

question 2:why should we build oem?

question 3:how to?

Comments