linux手动创建oracle实例全过程

先理解几个概念 oracle跟mysql和mssql的不同,提出了实例和表空间等的概念

实例:即一个运行的服务,不含任何物理数据和内容

数据库:依托于实例运行,数据库和实例可以使1对1的关系,也可以是一对多的管理,即可以有不同实例加载数据库,但是一个实例只能加载一个数据库

一个操作系统可以运行多个数据库实例


因此,想要创建一个新的数据库,必须先运行一个实例。

但是oracle有表空间的概念,不同用户可以设置不同表空间的访问权,相当于把数据库划分出多个子模块,供不同用户使用

所以,在一般的情况下,利用表空间和用户控制方式,即可以实现分开独立的数据表管理


创建表空间和用户比较简单,利用plsql即可以实现


创建数据库实例(非图形界面):

//利用crt进入linux操作系统

$su - oracle //进入oracle用户模式下

$echo $ORACLE_HOME  //查看oracle的home目录位置 假如home目录/opt/11g/oracle/product/11.2.0/dbhome_1,那么执行cd $ORACLE_HOME等效于cd /opt/11g/oracle/product/11.2.0/dbhome_1

$echo $ORACLE_BASE  //查看oracle的base目录

 

//创建实例配置文件

$cd $ORACLE_HOME

$cd dbs

$cp initorcl.ora  initvcenter.ora

$vi  initvcenter.ora   

db_name='vcenter'
vcenter.__java_pool_size=402653184
vcenter.__large_pool_size=134217728
vcenter.__oracle_base='/opt/11g/oracle'
vcenter.__pga_aggregate_target=11341398016
vcenter.__sga_target=34024194048
vcenter.__shared_io_pool_size=0
vcenter.__shared_pool_size=7985954816
vcenter.__streams_pool_size=67108864
*.audit_file_dest='/opt/11g/oracle/admin/vcenter/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files = (ora_control3, ora_control4)
*.db_block_size=8192
*.db_domain=''
*.db_name='vcenter'
*.db_recovery_file_dest='/opt/11g/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/opt/11g/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=YFZD2XDB)'
*.local_listener=''
*.open_cursors=300
*.pga_aggregate_target=11333009408
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=34001125376
*.undo_tablespace='UNDOTBS1'


//创建实例相关目录--作用未理解


$cd $ORACLE_BASE

$cd admin

$mkdir vcenter

$cd vcenter

$mkdir adump  bdump  cdump  pfile  udump

//创建vcenter数据文件

cd /oradata

mkdir vcenter     

//启动实例

$export ORACLE_SID=vcenter

$sqlplus /nolog

sql>conn /as sysdba;

sql>startup nomount;

sql>select instance_name from v$instance;   //正常启动后执行语句可以看到运行的实例


//创建密码文件--作用还未理解

$$ORACLE_HOME/bin/orapwd file=$ORACLE_HOME/dbs/orapwvcenter password=Aa123456* force=y  //文件生成在$ORACLE_HOME/dbs目录下


//创建数据库脚本如下,进入到sql界面执行下面语句

sql>

  CREATE DATABASE vcenter
   USER SYS IDENTIFIED BY sys
   USER SYSTEM IDENTIFIED BY manager
   LOGFILE GROUP 1 ('/oradata/vcenter/redo01.log') SIZE 20M,
           GROUP 2 ('/oradata/vcenter/redo02.log') SIZE 20M,
           GROUP 3 ('/oradata/vcenter/redo03.log') SIZE 20M
   MAXLOGFILES 5
   MAXLOGMEMBERS 5
   MAXLOGHISTORY 1
   MAXDATAFILES 100
   MAXINSTANCES 1
   CHARACTER SET US7ASCII
   NATIONAL CHARACTER SET UTF8
   DATAFILE '/oradata/vcenter/system01.dbf' SIZE 325M REUSE
   EXTENT MANAGEMENT LOCAL
   SYSAUX DATAFILE '/oradata/vcenter/sysaux01.dbf' SIZE 325M REUSE
   DEFAULT TABLESPACE tbs_1 datafile '/oradata/vcenter/tbs_1.dbf' size 50m
   DEFAULT TEMPORARY TABLESPACE temp
      TEMPFILE '/oradata/vcenter/temp01.dbf'
      SIZE 20M REUSE
   UNDO TABLESPACE undotbs1
      DATAFILE '/oradata/vcenter/undotbs1.dbf'
      SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

//其中UNDO TABLESPACE undotbs1必须与实例配置文件中的名字完全一样

sql>select status from v$instance;

//status为open表示成功



//运行后续脚本,创建数据字典及相关视图

SQL>conn sys as sysdba

SQL>@?/rdbms/admin/catalog.sql;

//此过程可能需要10分钟左右

SQL>@?/rdbms/admin/catproc.sql;

/此过程可能需要15分钟左右

SQL>@?/rdbms/admin/catblock.sql;

SQL>@?/rdbms/admin/catoctk.sql;

SQL>@?/rdbms/admin/owminst.plb;

SQL>conn system/ manager

SQL>@?/sqlplus/admin/pupbld.sql;

SQL>@?/sqlplus/admin/help/hlpbld.sql helpus.sql

//配置listener.ora和tnsnames.ora,这两个文件在$ORACLE_HOME/network/admin目录下

listener.ora

(SID_LIST=
      (SID_DESC=
         (GLOBAL_DBNAME = vcenter)         
         (ORACLE_HOME = /opt/11g/oracle/product/11.2.0/dbhome_1)
         (SID_NAME = vcenter)
       )
  )

tnsnames.ora
vcenter =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = vcenter)
    )
  )



很多具体细节还不是很明白,以后弄通了再补充!

参考资料:

http://blog.csdn.net/sunchenglu7/article/details/39676659

http://www.linuxidc.com/Linux/2014-08/105552.htm

-------------------------------------------------------------------------------------------

服务器重启后,如何启动oracle

su - oracle

$lsnrctl status

$lsnrctl start  //启动监听

$export ORACLE_SID=vcenter

$sqlplus /nolog

sql>conn /as sysdba;

sql>startup

sql>select status from v$instance;


不过oracle启动模式有3种:

 Startup nomount  (nomount模式)启动实例不加载数据库。

Startup mount (mount模式)启动实例加载数据库但不打开数据库

 Startup (open 模式)启动实例加载并打开数据库,就是我们上面所用的命令

 Nomount模式中oracle仅为实例创建各种内存结构和服务进程,不会打开任何数据库文件


数据库的关闭(SHUTDOWN)

对于数据库的关闭,有四种不同的关闭选项,下面对其进行一一介绍。

1、SHUTDOWN NORMAL

这是数据库关闭SHUTDOWN命令的确省选项。也就是说假如您发出SHUTDOWN这样的命令,也即是SHUTDOWN NORNAL的意思。

发出该命令后,任何新的连接都将再不允许连接到数据库。在数据库关闭之前,Oracle将等待现在连接的任何用户都从数据库中退出后才开始关闭数据库。采用这种方式关闭数据库,在下一次启动时无需进行任何的实例恢复。但需要注意一点的是,采用这种方式,也许关闭一个数据库需要几天时间,也许更长。

2、SHUTDOWN IMMEDIATE

这是我们常用的一种关闭数据库的方式,想很快地关闭数据库,但又想让数据库干净的关闭,常采用这种方式。

当前正在被Oracle处理的SQL语句立即中断,系统中任何没有提交的事务全部回滚。假如系统中存在一个很长的未提交的事务,采用这种方式关闭数据库也需要一段时间(该事务回滚时间)。系统不等待连接到数据库的任何用户退出系统,强行回滚当前任何的活动事务,然后断开任何的连接用户。

3、SHUTDOWN TRANSACTIONAL

该选项仅在Oracle 8i后才能够使用。该命令常用来计划关闭数据库,他使当前连接到系统且正在活动的事务执行完毕,运行该命令后,任何新的连接和事务都是不允许的。在任何活动的事务完成后,数据库将和SHUTDOWN IMMEDIATE同样的方式关闭数据库。

4、SHUTDOWN ABORT

这是关闭数据库的最后一招,也是在没有任何办法关闭数据库的情况下才不得不采用的方式,一般不要采用。假如下列情况出现时能够考虑采用这种方式关闭数据库。 数据库处于一种非正常工作状态,不能用shutdown normal或shutdown immediate这样的命令关闭数据库;



      所以说:

   1)  创建新数据库

   2)  重建控制文件

     这2种操作都必须在这个模式下进行。

      Mount模式中oracle只装载数据库但不打开数据库,所以说:

     1)     重命名数据文件

     2)     添加、删除和重命名重做日子文件

     3)     执行数据库完全恢复操作

     4)     改变数据库的归档模式

     这4种操作都必须在这个模式下进行

     Open模式(就是我们上面的startup不带任何参数的)正常启动。

    当然这3种模式之间可以转换:

    Alter database mount(nomount模式)—〉alter database open(mount 模式)—〉(open模式)


   当然还有其它一些情况,在我们open模式下可以将数据库设置为非受限状态和受限状态

  在受限状态下,只有DBA才能访问数据库,所以说:

1)  执行数据导入导出

2)  使用sql*loader提取外部数据

3)  需要暂时拒绝普通用户访问数据库

4)  进行数据库移植或者升级操作


关闭服务器防火墙

# serviceiptables stop   关闭防火墙,会话级起效,重启后失效

# chkconfigiptables off   不随操作系统自动启动


oracle数据库备份与还原

表导出与还原

imp admin/admin@实例名 file=/dbbackup/table_20180109.dmp tables=yfplss03   
exp admin/admin@实例名 file=/dbbackup/table_20180109.dmp .dmp  log=$DIR/$DATE'/table_log_'$DATE'.log' TABLES=table

完全导出

exp yfplss03/yfplss03@YFZD2 file=$DIR/$DATE'/sbkfw_'$DATE'.dmp' log=$DIR/$DATE'/sbkfw_log_'$DATE'.log'

 


有三种主要的方式(完全、用户、表)
      1、完全:
          EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
          如果要执行完全导出,必须具有特殊的权限
      2、用户模式:
          EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC
          这样用户SONIC的所有对象被输出到文件中。
      3、表模式:
          EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
          这样用户SONIC的表SONIC就被导出
    2、IMP:
      具有三种模式(完全、用户、表)
      1、完全:
          IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
      2、用户模式:
          IMP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC
          这样用户SONIC的所有对象被导入到文件中。必须指定FROMUSER、TOUSER参数,这样才能导入数据。
      3、表模式:
          EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC)
          这样用户SONIC的表SONIC就被导入。


http://blog.csdn.net/lsyuan1989/article/details/50418665

https://www.cnblogs.com/yugen/archive/2010/07/25/1784763.html



--------------------------------补充笔记-----------------------------------------

select * from v$session where status ='ACTIVE' 

select * from v$locked_object

select * from all_objects

select * from dba_jobs_running

select * from dba_jobs


查看Oracle正在执行的任务

select a.program, b.spid, c.sql_text,c.SQL_ID
from v$session a, v$process b, v$sqlarea c
where a.paddr = b.addr
and a.sql_hash_value = c.hash_value
and a.username is not null;

由于sql_text列没有显示完整
的sql语句.所以找到sql_id:686nqabc8sgs2再查询v$sql
select a.* from v$sql a where a.SQL_ID='686nqabc8sgs2'
可以查看完整的sql文本内容
 
 
  --查询Oracle正在执行的sql语句及执行该语句的用户

SELECT b.sid oracleID,
b.username 登录Oracle用户名,
b.serial#,
spid 操作系统ID,
paddr,
sql_text 正在执行的SQL,
b.machine 计算机名
FROM v$process a, v$session b, v$sqlarea c
WHERE a.addr = b.paddr
AND b.sql_hash_value = c.hash_value

 

--查看正在执行sql的发起者的发放程序

SELECT OSUSER 电脑登录身份,
PROGRAM 发起请求的程序,
USERNAME 登录系统的用户名,
SCHEMANAME,
B.Cpu_Time 花费cpu的时间,
STATUS,
B.SQL_TEXT 执行的sql
FROM V$SESSION A
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
AND A.SQL_HASH_VALUE = B.HASH_VALUE
ORDER BY b.cpu_time DESC

 

--查出oracle当前的被锁对象

SELECT l.session_id sid,
s.serial#,
l.locked_mode 锁模式,
l.oracle_username 登录用户,
l.os_user_name 登录机器用户名,
s.machine 机器名,
s.terminal 终端用户名,
o.object_name 被锁对象名,
s.logon_time 登录数据库时间
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial#;

------------------------数据库关闭不成功处理办法--------------------------------

关闭数据库是shutdown 后面没有接关闭参数中的任何一个。

nomal --->所有连接都断开时才能关闭;

transactional --->等待事务结束后,主动断开连接;

immediate --->主动断开事务和连接

abort --->立刻关闭数据库,这个操作是危险的,不会同步数据,不触发检查点,回滚段直接清 空,相当于掉电,每次启动都要实例恢复。

所以,数据库关闭很慢,这时我一心急,就直接退出了sqlplus,造成Oracle文件被lock,当我再次startup时,操作失败,因为文件依然被锁定状态。报错ORA-01012: not logged on.

后来重启服务,就可以用了,看了oracle的报错解释,更让我费解。虽然问题解决了,但是生产环境是不能随便down机的,所以,这个问题待续…

kill oracle 进程 或者关掉oracle

ps -ef|grep ora_dbw0_$ORACLE_SID

kill -9 pid

重新启动oracle

sqlplus sys as sysdba

startup;