1. 程式人生 > >linux手動建立oracle例項全過程

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/[email protected]例項名 file=/dbbackup/table_20180109.dmp tables=yfplss03   
exp admin/[email protected]例項名 file=/dbbackup/table_20180109.dmp .dmp  log=$DIR/$DATE'/table_log_'$DATE'.log' TABLES=table

完全匯出

exp yfplss03/[email protected] 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

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$sqlselect 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 sWHERE l.object_id = o.object_idAND l.session_id = s.sidORDER 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;