瞭解 Oracle Linux Install Using LVM 與 LVM (Logical Volume Mamager) on Linux 動態放大檔案系統 的基本概念後,接下來就可以來安裝 Oracle Database 12c Release 1 (12.1),所需要的檔案有 linuxamd64_12c_database_1of2.zip & linuxamd64_12c_database_2of2.zip 可以從下列兩個網址取得:

實作環境說明:

host name : oradb12clinux.globeunion.com
ip address : 192.168.0.210


DB 安裝在 /u01 目錄下

以下均以帳號 root 執行

Step00: 建立資料庫相關帳號與群組

groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
#groupadd -g 54324 backupdba
#groupadd -g 54325 dgdba
#groupadd -g 54326 kmdba
#groupadd -g 54327 asmdba
#groupadd -g 54328 asmoper
#groupadd -g 54329 asmadmin

useradd -u 54321 -g oinstall -G dba,oper oracle

再設定 oracle 帳號的密碼:
passwd oracle

 

Step 01: Unpack Files 解壓檔案

unzip linuxamd64_12c_database_1of2.zip
unzip linuxamd64_12c_database_2of2.zip

 

Step 02: 編輯 /etc/hosts

127.0.0.1       localhost.localdomain  localhost
192.168.0.210   oradb12clinux.globeunion.com    oradb12clinux

 

Step03: 修改檔案 /etc/sysctl.conf 增加下列內容

fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

然後執行指令 /sbin/sysctl -p 讓它生效

 

Step04: 修改檔案 /etc/security/limits.conf 增加下列內容

oracle   soft   nofile    1024
oracle   hard   nofile    65536
oracle   soft   nproc    2047
oracle   hard   nproc    16384
oracle   soft   stack    10240
oracle   hard   stack    32768

 

Step05: 若安裝 Oracle Linux Install Using LVM 時沒選相關的套件,則請以 root 的帳號來裝下列套件

# From Public Yum or ULN
yum install binutils -y
yum install compat-libcap1 -y
yum install compat-libstdc++-33 -y
yum install compat-libstdc++-33.i686 -y
yum install gcc -y
yum install gcc-c++ -y
yum install glibc -y
yum install glibc.i686 -y
yum install glibc-devel -y
yum install glibc-devel.i686 -y
yum install ksh -y
yum install libgcc -y
yum install libgcc.i686 -y
yum install libstdc++ -y
yum install libstdc++.i686 -y
yum install libstdc++-devel -y
yum install libstdc++-devel.i686 -y
yum install libaio -y
yum install libaio.i686 -y
yum install libaio-devel -y
yum install libaio-devel.i686 -y
yum install libXext -y
yum install libXext.i686 -y
yum install libXtst -y
yum install libXtst.i686 -y
yum install libX11 -y
yum install libX11.i686 -y
yum install libXau -y
yum install libXau.i686 -y
yum install libxcb -y
yum install libxcb.i686 -y
yum install libXi -y
yum install libXi.i686 -y
yum install make -y
yum install sysstat -y
yum install unixODBC -y
yum install unixODBC-devel -y

 

Step06: 修改檔案 /etc/security/limits.d/90-nproc.conf

# Change this
*          soft    nproc    1024

# To this
* - nproc 16384

 

Step07: 修改檔案 /etc/selinux/config

SELINUX=permissive

然後執行指令 setenforce Permissive 讓它生效

 

Step08: 關閉防火牆

# service iptables stop 
# chkconfig iptables off

 

Step09: 建立目錄及設定權限

mkdir -p /u01/app/oracle/product/12.1.0/db_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01

 

Step10: 編輯帳號:oracle ,目錄下的 /home/oracle/.bash_profile

# Oracle Settings
export TMP=/tmp
export TMPDIR=$TMP

export ORACLE_HOSTNAME=oradb12clinux.globeunion.com
export ORACLE_UNQNAME=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/db_1
export ORACLE_SID=orcl

export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

最後,以帳號 oracle 登入執行 ./runInstaller 執行資料庫 Oracle DB 12c 安裝即可。

 

註: 在安裝過程中,會要求您切換帳帳,以 root 的權限執行兩個檔案 orainstRoot.sh & root.sh

[oracle@oradb12clinux database]$ su -
[root@oradb12clinux ~]# /u01/app/oraInventory/orainstRoot.sh
[root@oradb12clinux ~]# /u01/app/oracle/product/12.1.0/db_1/root.sh

安裝完成後的資訊

oradb12c-configuration  

可以用WEB進入管理

oradb12c-em  

若是沒有辦法顯示此登錄劃面,可以用下列指令檢查 EM (Enterprise Manager Database Express) 的 port 是否為 5500,若不是則更改之。

SQL> SELECT dbms_xdb_config.gethttpsport FROM dual;

GETHTTPSPORT
------------
        5500

SQL> EXEC dbms_xdb_config.sethttpsport(5500);

PL/SQL procedure successfully completed.

SQL>

 

資料庫的啟動與關閉

[oracle@oradb12clinux ~]$ sqlplus /nolog

SQL> connect /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 1653518336 bytes
Fixed Size            2289016 bytes
Variable Size         1073742472 bytes
Database Buffers      570425344 bytes
Redo Buffers            7061504 bytes
Database mounted.
Database opened.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

TNS Listenser 的啟動與關閉lsnrctl start/stop 及 TNS 測試:tnsping

[oracle@oradb12clinux ~]$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 24-OCT-2013 13:18:14

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/12.1.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.1.0 - Production
System parameter file is /u01/app/oracle/product/12.1.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/oradb12clinux/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oradb12clinux)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
Start Date                24-OCT-2013 13:18:14
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.1.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oradb12clinux/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oradb12clinux)(PORT=1521)))
The listener supports no services
The command completed successfully

[oracle@oradb12clinux ~]$ tnsping orcl

TNS Ping Utility for Linux: Version 12.1.0.1.0 - Production on 24-OCT-2013 13:20:19

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/12.1.0/db_1/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oradb12clinux.globeunion.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK (0 msec)

 

註:若要建立另一個資料庫(SID),可以使用指令 dbca 來建.

參考文件:

http://www.oracle-base.com/articles/12c/oracle-db-12cr1-installation-on-oracle-linux-6.php

http://figaro.neo-info.net/?cat=218

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

繼上章 Oracle Linux Install Using LVM,我們談到 LVM 的好處在於可以動態放大檔案系統,接下來就來做做看,假設我們安裝 Oracle Linux 時的磁碟配置如下,Volume Group:vg0 有三個 Physical Volume 實體磁區(簡稱PV),依下圖的配置來看,vg0 還有大約 13 G 未分配的磁碟空間。

lvm_01

 

下圖是整個系統磁碟的配置情況:

lvm_02  

 

系統安裝完後,可以用指令 lvscan 來查詢 LVM 實際擁有的空間

[root@oradb12clinux ~]# lvscan
  ACTIVE            '/dev/vg0/lv_u01' [15.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_root' [10.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_swap' [4.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_opt' [8.00 GiB] inherit

 

也可以使用指令 df -h 來看各個磁碟現在的使用狀況

[root@oradb12clinux ~]# df -h
Filesystem                                             Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_root                      9.9G  4.1G  5.4G  43%    /
tmpfs                                                    2.0G  176K  2.0G   1%    /dev/shm
/dev/sda1                                            194M   51M  134M  28%  /boot
/dev/sda2                                            811M   17M  753M   3%  /home
/dev/mapper/vg0-lv_opt                      7.9G  146M  7.4G   2%   /opt
/dev/mapper/vg0-lv_u01                       15G  166M   14G   2%  /u01

 

用指令 vgdisplay 查詢一下 Volume Group:vg0 是否有未分配的磁碟空間

[root@oradb12clinux oradb12c]# vgdisplay
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                4
  Open LV               4
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               49.99 GiB
  PE Size               4.00 MiB
  Total PE              12797
  Alloc PE / Size       10521 / 41.10 GiB
  Free  PE / Size       2276 / 8.89 GiB
  VG UUID               MJcTqC-prDM-v0Ys-4s2c-0Fze-vGFD-THI2Iw

 

當發生磁碟空間不足,而 vg0 仍有未分配的磁碟空間時,就可以利用指令 lvextend -L 來增大空間,這樣是不是很方便呢!!

[root@oradb12clinux ~]# lvextend -L +100M '/dev/vg0/lv_opt'
  Extending logical volume lv_opt to 8.10 GiB
  Logical volume lv_opt successfully resized

ot@oradb12clinux oradb12c]# lvextend -L +4096 '/dev/vg0/lv_root'
  Extending logical volume lv_root to 14.00 GiB
  Logical volume lv_root successfully resized


[root@oradb12clinux oradb12c]# lvscan
  ACTIVE            '/dev/vg0/lv_u01' [15.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_root' [14.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_swap' [4.00 GiB] inherit
  ACTIVE            '/dev/vg0/lv_opt' [8.10 GiB] inherit


[root@oradb12clinux oradb12c]# df -h
Filesystem                                             Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_root                      9.9G  8.8G  644M  94% /
tmpfs                                                     2.0G  264K  2.0G   1% /dev/shm
/dev/sda1                                             194M   51M  134M  28% /boot
/dev/sda2                                             811M   17M  753M   3% /home
/dev/mapper/vg0-lv_opt                       7.9G  146M  7.4G   2% /opt
/dev/mapper/vg0-lv_u01                      15G  166M   14G   2% /u01

 

發現了沒?! Logical Volume 邏輯磁區(簡稱 LV)'/dev/vg0/lv_root' 變大了,變為 14G,但用 df -h 去看時仍為 9.9 G ,lv_opt 也是相同的情形,那是因為尚未讓系統知道磁碟空間己變大,可以使用 resize2fs 來讓系統重新分配,若出現 Cannot use resize2fs as it is online. Use ext2online instead.  訊息,則是告知您,因磁碟在online 的情況下不能使用指令 resize2fs ,需以指令 ext2online 來替代。

[root@oradb12clinux oradb12c]# resize2fs /dev/vg0/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg0/lv_root is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vg0/lv_root to 3670016 (4k) blocks.
The filesystem on /dev/vg0/lv_root is now 3670016 blocks long.

[root@oradb12clinux oradb12c]# resize2fs /dev/vg0/lv_opt
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg0/lv_opt is mounted on /opt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/vg0/lv_opt to 2122752 (4k) blocks.
The filesystem on /dev/vg0/lv_opt is now 2122752 blocks long.

[root@oradb12clinux oradb12c]# df -h
Filesystem                                               Size  Used Avail Use% Mounted on
/dev/mapper/vg0-lv_root                       14G  8.8G  4.4G  67% /
tmpfs                                                      2.0G  264K  2.0G   1% /dev/shm
/dev/sda1                                               194M   51M  134M  28% /boot
/dev/sda2                                               811M   17M  753M   3% /home
/dev/mapper/vg0-lv_opt                         8.0G  146M  7.5G   2% /opt
/dev/mapper/vg0-lv_u01                        15G  166M   14G   2% /u01

 

再查詢一次,看吧!! 系統也同步將空間實際放大了

 附註:若要看各個 Logical Volume 邏輯磁區(簡稱 LV)的狀態,可以用指令lvdisplay 查詢

[root@oradb12clinux oradb12c]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg0/lv_u01
  LV Name                lv_u01
  VG Name                vg0
  LV UUID                qEiPkX-e9tf-SZow-0lWO-mani-vVG5-z8z3Su
  LV Write Access        read/write
  LV Creation host, time oradb12clinux.globeunion.com, 2013-10-24 00:26:18 +0800
  LV Status              available
  # open                 1
  LV Size                15.00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:2
   
  --- Logical volume ---
  LV Path                /dev/vg0/lv_root
  LV Name                lv_root
  VG Name                vg0
  LV UUID                0O3A7O-Lecx-bYK8-orvi-HaG3-Wc9h-OdqZbq
  LV Write Access        read/write
  LV Creation host, time oradb12clinux.globeunion.com, 2013-10-24 00:26:26 +0800
  LV Status              available
  # open                 1
  LV Size                14.00 GiB
  Current LE             3584
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0
   
  --- Logical volume ---
  LV Path                /dev/vg0/lv_swap
  LV Name                lv_swap
  VG Name                vg0
  LV UUID                gV4fRO-FSVF-F7H2-pL9X-qJef-IfUO-mO6oLN
  LV Write Access        read/write
  LV Creation host, time oradb12clinux.globeunion.com, 2013-10-24 00:26:27 +0800
  LV Status              available
  # open                 2
  LV Size                4.00 GiB
  Current LE             1024
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1
   
  --- Logical volume ---
  LV Path                /dev/vg0/lv_opt
  LV Name                lv_opt
  VG Name                vg0
  LV UUID                18OarF-nVXJ-er3a-WsYn-lKJT-LEyJ-1YHcKr
  LV Write Access        read/write
  LV Creation host, time oradb12clinux.globeunion.com, 2013-10-24 00:26:27 +0800
  LV Status              available
  # open                 1
  LV Size                8.10 GiB
  Current LE             2073
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3

 

參考:

http://www.dbvisit.com/forums/showthread.php?t=343

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

設置的截圖如下:

先設定帳號對 msdb 資料庫有權限,並且有 SQLAgentOperator & SQLAgentReaderRole & SQLAgentUserRole 的角色

ProxyAccounts-loginProperties

Grant 給 MSSQL DB User:s1 上述權限後,就可以看到 SQL Server Agent

proxyAccount-SQLServerAgent 

由 MSSQL DB User:s1 建立 Job: del file

job-delfile

 

由 s1 執行會失敗,因 s1 沒有 OS 權限

 

Credential-user

 

ProxyAccount-generalProxyAccount-Principals  

 

 

job-proxyAccount  

 

 

 

 

MIS 發表在 痞客邦 留言(0) 人氣()

MSSQL Server 2012 對於 table  中的欄位作加密已有支援,作業如下:


-- Create EmployeeReviews table and grant permissions
USE AdventureWorks

IF EXISTS (SELECT * FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id
           WHERE t.[Name] = 'EmployeeReview' AND s.[Name] = 'HumanResources')
 DROP TABLE HumanResources.EmployeeReview

CREATE TABLE HumanResources.EmployeeReview
(EmployeeID int NOT NULL,
 ReviewDate datetime DEFAULT GETDATE() NOT NULL,
 Comments varbinary(2000) NOT NULL)

-- Create database master key
IF NOT EXISTS(SELECT * FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##')
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'Pa$$w0rd'

-- Create certificate
CREATE CERTIFICATE HRAppCert
WITH SUBJECT = 'HR certificate'
GO

-- Create symmetric key
CREATE SYMMETRIC KEY HRKey
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE HRAppCert
GO

-- Insert encrypted data
    OPEN SYMMETRIC KEY HRKey DECRYPTION BY CERTIFICATE HRAppCert

    INSERT INTO HumanResources.EmployeeReview
    VALUES
    (1, DEFAULT, EncryptByKey(Key_GUID('HRKey'),'Increasing salary to $35,000'))

    CLOSE ALL SYMMETRIC KEYS


-- Read the decrypted data as HRApp
    OPEN SYMMETRIC KEY HRKey DECRYPTION BY CERTIFICATE HRAppCert
    SELECT CONVERT(varchar,DecryptByKey(Comments)) AS Comments FROM HumanResources.EmployeeReview
    CLOSE ALL SYMMETRIC KEYS

EncryptData  

MIS 發表在 痞客邦 留言(0) 人氣()

MSSQL Server 2012 在帳號認證可以採用 Windows Authentication 或是 SQL Server and Windows Authentication 混合模式兩種,認證模式若有修改則需重啟 SQL Server 才會生效。

MSSQL-Security-mode  

 

若您只要使用 MSSQL Server 內鍵資料庫的帳號,但又要使用OS系統的 Security Policy 的原則,則除了將 MSSQL Server 的 Security 改為SQL Server and Windows Authentication 混合模式外,在建立資料庫帳號前先設定好 Local Security Policy,例如:密碼長度至少要 4 碼。

LocalSecurityPolicy  

然後建立 MSSQL Server 帳號時,除了選擇 Login name 是以 SQL Server authentication 外,Enforce password policy 也要打勾才行。

MSSQL-DB-User-Create  

這樣就可以使用 MSSQL Server DB 內鍵帳號登入了,個人是認為以此種方式較為單純,而不需用純 Windows Authentication ,因為管資料庫的並不一定會管OS系統對吧!最後要提醒一下,此時的帳號只是能登入 MSSQL Server ,若要它能使用特定的資料庫,還得在 User Mapping 中設定對那一個資料庫有權限,權限的等級為何,這樣這個帳號才有辦法存取特定的資料庫內容。

userMapping  

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

MSSQL Server 2000  建立一個資料庫時, 會有兩個檔案 MDF 檔(資料檔) 及 LDF 檔(交易檔), 有時因為某種原因(如當機, 備份時間不一致...等), 致使這兩個檔的 LSN 不一致. 或者只備份 MDF 檔, 因此在附加資料庫時, 會發生 LSN 的錯誤. 以致於資料庫無法附加


環境:
OS: Windows Server 2k3 SP2
MSSQL: 2000 版本8.0
資料庫: ATest
資料庫檔案: D:\DB\ATest_Data.MDF (遺失 ATest_Log.LDF 或兩者不同步, 導致附加資料庫時出現 LSN 錯誤)

要救回資料庫的方法如下:

Step 01: 新建立一個相同的資料庫, 建立好後 shutdown MSSQL 2k


Step 02: 移除新建立資料庫的檔案 D:\DB\ATest_Data.MDF & ATest_Log.LDF , 將原來的 ATest_Data.MDF 放回 D:\DB

Step 03: 在 SQL Query Analyzer 中執行以下语句,把该数据库设置为紧急模式
Use Master
Go
sp_configure 'allow updates', 1
reconfigure with override
Go




Step 04: 接著執行 下列指令
update sysdatabases set status = 32768 where name = 'ATest'

Step 05: 重启SQL Server服务, 會發生此資料庫進入緊急模式


Step 06: 執行 sp_dboption 指令,把資料庫设为Single User模式;
sp_dboption 'ATest', 'single user', 'true'

Step 07: 執行 DBCC CHECKDB
DBCC CHECKDB('ATest')


Step 08: 執行 DBCC REBUILD_LOG , 重建立 LDF 檔, 此時可以看到資料庫內的資料表了
DBCC REBUILD_LOG('ATest','D:\DB\ATest_Log.LDF')




Step 09: 執行下列指令, 将資料庫回覆正常狀態
update sysdatabases set status=0 where name='ATest'
或者
sp_resetstatus "ATest"
go
sp_configure 'allow updates', 0
reconfigure with override



Step 10: 執行 sp_dboption 指令, 將資料庫設回多人模式:
sp_dboption 'ATest','dbo use only','false'

Step 11: 重啟 MSSQL Server 2000 即可

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

MSSQL Server 2012 Restore 備份還原概念:

MSSQL Server 2012 Restore 在還原的過程中,有三個階段 (Phase):

1. Data Copy:建立實體檔案,與回存資料

2. Redo:從 LOG File 回存所有已經確認 ( commit ) 的 Transaction

3. Undo:回覆 ( Roll Back ) 在還原時間點時未確認的 Transaction (交易)

至於 MSSQL Server 2012 Restore 還原概念,大致是以下列 4 個步驟,不過這 4 個步驟應該也是大部份資料庫系統採用的方法,像 Oracle DB 的 RMAN 也是如此。

  • 1. 先嚐試執行 Tail-log 備份
  • 2. 回存最近一次全備份
  • 3. 回存最近一次的差異備份
  • 4. 回存所有備份 LOG Fiile 裡的 Transaction ,再回存第一步驟所備份 tail-log 中的 Transaction

 

備份還原實作

首先建立一個目錄 C:\backups 作為備份的目錄,接下來的步驟則是模擬資料庫 Northwind 的檔案毁損時,資料庫重建的完整過程

--1.建立備份裝置 mybackup(backup device)
指令:
EXEC master.dbo.sp_addumpdevice  @devtype = N'disk', @logicalname = N'mybackup', @physicalname = N'C:\backups\mybackup.bak'


backup-device   

 

--2.檢查 Northwind資料庫是否為 Full Recovery mode
MSSQL-Server-option  

 

--3.執行完整資料庫備份

指令:
BACKUP DATABASE [Northwind] TO  [mybackup] WITH FORMAT, INIT,  NAME = N'Northwind-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

Northwind-Full-backup  

--4.建立資料表(log中有此資料表)

指令:
use Northwind
go
create table table1 (a int , b int)
go

--5.backup log(log備份且 table1被清除)
指令:
BACKUP LOG [Northwind] TO  [mybackup] WITH NOFORMAT, NOINIT,  NAME = N'Northwind-Transaction Log  Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

Northwind-log-backup  

--6.新增資料(log中有 1 1 )
指令:
insert table1 values (1,1)

--7.backup log(log備份且 1 1被清除)
指令:
BACKUP LOG [Northwind] TO  [mybackup] WITH NOFORMAT, NOINIT,  NAME = N'Northwind-Transaction Log  Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

--8.新增資料(log中有 2 2 )
指令:
insert table1 values (2,2)

--破壞資料庫

1.stop sql service
2.rename C:\TSQL2K8DB\Northwind.mdf --> C:\TSQL2K8DB\Northwind.xxx
3.copy C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA 到上層目錄
4.start sql service
5.sql log查詢壞掉的檔案
6.檢查資料庫狀態,這時資料庫的狀態會變成 Recovery Pending

--7.tail log backup
a.device右鍵-->database-->
Database:Northwind
backup type:log
option-->backup the tail of ....

 device-backup

因為資料庫:Northwind 已被破壞,所以只能從 Backup Devices:mybackup 作 Tail-log 備份,這也是在 MSSQL Server 2012 Backup 備份 中建議用 Backup Devices 的好處之一。

Northwind-log-backup

Northwind-tail-backup   

指令:
BACKUP LOG [Northwind] TO  [mybackup] WITH  NO_TRUNCATE , NOFORMAT, NOINIT,  NAME = N'Northwind-Transaction Log  Backup', SKIP, NOREWIND, NOUNLOAD,  NORECOVERY ,  STATS = 10

整個備份完的記錄可以 Device 的 Media Contents 中查詢

Device-Media-Contents 
b.檢查資料庫狀態,因為資料庫:Northwind 的資料檔名已被修改成 Northwind.mdf --> Northwind.xxx,重啟 MSSQL Server 伺服器後,MSSQL Server 檢查有問題,會將 Northwind 的狀態改為 Recovery Pending

device-backup 

c.選 Northwind,右鍵-->task-->restore-->database
指令:
RESTORE DATABASE [Northwind] FROM  DISK = N'C:\backups\mybackup.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE LOG [Northwind] FROM  DISK = N'C:\backups\mybackup.bak' WITH  FILE = 2,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE LOG [Northwind] FROM  DISK = N'C:\backups\mybackup.bak' WITH  FILE = 3,  NORECOVERY,  NOUNLOAD,  STATS = 10
GO
RESTORE LOG [Northwind] FROM  DISK = N'C:\backups\mybackup.bak' WITH  FILE = 4,  NOUNLOAD,  STATS = 10
GO

若是用 SQL Server Management Studio 回存也是很方便操作
full-restore 






 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

MSSQL Server 2012 Transaction Concept 概念:

MSSQL Server 2012 在資料寫的的運作上,是秉持著 WAL(Write Ahead Logging) 的機制,Transaction 存取磁碟的作業,主要是依照下列 4 個步驟來作業:

  • 1. 將 Transaction 寫入 LOG File
  • 2. 將 Transaction 的異動修改 Buffer (記憶體) 裡的資料
  • 3. 交易完成 Transaction Commit
  • 4. 將 Buffer (記憶體) 裡的資料寫入 Disk ( Data Files )裡

 

Recovery Model:

在說明 MSSQL Server 2012 的備份模式前,要先瞭解它的 Recovery Model,MSSQL Server 2012 的 Recovery Model 有三種模式:

Recovery Model  

1. Simple:當 Transaction Commit 交易確認後,此 Transaction Log 就會從 LOG File 中清除(Truncate),所以 LOG File 並不會長大,LOG File 的檔案大小永遠保持最小。

2. Full:所有的 Transaction 交易都會保留在 LOG File 中,所以 LOG File 會一直長大,除了作備份作業後,LOG File 裡的 Transaction 內容才會被清除(Truncate),當然 LOG File 檔案要縮小,還得手動執行 Shrink Log 才行,如下圖示

shrink_cmd

Shrink_Log  

3. Bulk Logged:當有 Bulk Insert 的 SQL 語法時,這些 批次 的 Transaction 不會記錄在 LOG File 中。

 

Backup Type:

在 MSSQL Server 2012 的備份模式有七種模式,

  • 1. Full:所有的 Data files 及 Transaction Log 都備份
  • 2. Differential:只備份差異部份
  • 3. Partial:主要的 Primary Filegroup,與指定的 Filegroup
  • 4. Transaction Log:只備份 Log File 中的 Transaction,回存時需搭配 Full 備份的檔案
  • 5. Tail-log Backup:只備份尚存在 LOG File 中的 Transaction,如 15:00 執行了 Transaction Log 備份,下一次的備份時間在 16:00 ,但 SQL Server 在 15:30 掛了,此時尚存在 LOG File 中的 Transaction 就是 Tail-log。
  • 6. File/File Group:指定的 File or File Group 備份
  • 7. Copy Only:這個模式主要是將現行運行的資料庫線上烤貝 Copy 一份到異地端存放用的,這個作業並不會影響 LSN 的序列號。

 

備份實作:

一般簡單全備的的指令為

BACKUP DATABASE { database_name | @database_name_var }   TO <backup_device> [ ,...n ]   [ <MIRROR TO clause> ] [ next-mirror-to ]   [ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ] [;]

如:
BACKUP DATABASE Northwind
TO DISK ='C:\SQLDB_DATA\back\Northwind.bck'

 但這樣的作法,並不是很好的方式,建議應該建立一個 Backup Device 來作備份的目標物,在 Backup Device 再設定實際的磁碟或磁帶,這樣在未來儲存目標物 (destination) 有變更時,只要修改此 Backup Device 的儲存目標物 (destination) 即可。

建立備份裝置 mybackup(backup device),指令如:

EXEC master.dbo.sp_addumpdevice  @devtype = N'disk', @logicalname = N'mybackup', @physicalname = N'C:\backups\mybackup.bak'

也可以用 SQL Server Management Studio 來建立

backup-device  
  

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

當電腦主機名變更時,如:SA01 變更為 VS21,MSSQL Server 2012 也要作相對應的更名作業,不然在執行某些作業時會有問題,變更的操作如下:

Step 01:change to SQLCMD MODE

SQL-CMD-Mode.png  

Step 02: Drop 現行的 Instance:SA01

先執行 select @@SERVERNAME 查詢現在的 Instance 是什麼,此時應為 SA01;確定後,再執行下列指令

sp_dropserver @@servername
go

Step 03:增加 VS21 的 Instance

sp_addserver 'vs21',local

Step03:重啟 SQL Server 服務

!!net stop mssqlserver
!!net start mssqlserver

要注意的事:MSSQL Server 2012 預設的 Default Instance Name 為 mssqlserver,若您有第二個以上的 Instance,如 I2 ,則應為主機名\I2,以此範例而言,應是VS21\I2。

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Struts2 的類型轉換方法有分成區域性及全域性兩種,以實例來說明這兩種的差別與設定方法。

實作的過程大致是這樣的:客戶端建立一個 X,Y 字串的輸入input.jsp ,然後經過 struts2 的類型轉換後,再顯示於客戶端 pointConverterResult.jsp

Step 01:建立 struts.xml 檔,內容為

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="test" namespace="/test" extends="struts-default">
        
        <action name="Hello" class="com.test.Hello">
            <result name="success">/test/Hello.jsp</result>
        </action>
        <action name="UserLogin_*" method="{1}" class="com.test.UserLoginAction">
            <result name="sign_on">/test/userLogin.jsp</result>
            <result name="input">/test/userLogin2.jsp</result>
            <result name="success">/test/userLoginResult.jsp</result>
        </action>
        
        <action name="PointConverter" class="com.test.PointConverterAction">
            <result name="success">/test/pointConverterResult.jsp</result>
        </action>
    </package>    
    
</struts>

 

Step 02:建立客戶端的輸入劃面 input.jsp & 處理後的的顥示劃面 pointConverterResult.jsp

input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() +":"+ request.getServerPort() + path;
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>" >

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Converter Demo</title>
</head>
<body>
point 欄位輸入座標 x,y 取出 x 與 y 值
<s:form name="frm_PointConver" action="PointConverter">
    <s:textfield name="point" label="point"/>
    <s:textfield name="point1" label="point1"/>
    <s:textfield name="age" label="age"/>
    <s:textfield name="username" label="userName" />
    <s:textfield name="date" label="birthday" />
    
    <s:submit/>
</s:form>
</body>
</html>

 

pointConverterResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>point Converter Result</title>
</head>
<body>

Point:<s:property value="point"/> <br>
Point1:<s:property value="point1"/> <br>
age:<s:property value="age"/><br>
username:<s:property value="username"/><br>
birthday:<s:property value="date"/><br>


</body>
</html>

 

Step 03:建立 class:Point 於 package: com.test 下,這個 class 很簡單,只是為了設定/取得 X,Y 軸的值

package com.test;

public class Point {

    private int x,y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
    
}

 

Step 04:建立一個自定類型轉換的 class: PointConverter 於 package: com.test 下,因為 struts2 的 JAR 檔內有一個 ognl-x.x.x.jar,此 JAR 包含了一個 class:TypeConverter,這個 class 預設有一個 DefaultTypeConverter method,所以可以利用這個 method 來改寫我們自已想要的類型轉換,文檔可以參考:http://commons.apache.org/proper/commons-ognl/apidocs/index.html

package com.test;

import java.util.Date;
import java.util.Map;

import ognl.DefaultTypeConverter;

public class PointConverter extends DefaultTypeConverter {

    @Override
    public Object convertValue(Map context, Object value, Class toType) {
        // TODO Auto-generated method stub
        //return super.convertValue(context, value, toType);
        
        // 從 客戶端 至 伺服器端
        if ( Point.class == toType ){
            Point point = new Point();
            
            String[] str = (String[]) value;
            String[] paramValues = str[0].split(",");
            
            int x = Integer.parseInt(paramValues[0]);
            int y = Integer.parseInt(paramValues[1]);
            
            point.setX(x);
            point.setY(y);
            
            return point;
        }
        

        // 從伺服器端 至 客戶端
        if (String.class == toType){
            Point point = (Point) value;
            
            int x = point.getX();
            int y = point.getY();
            
            String result = "[X:" + x + ",Y:" + y +"]";
            return result;
        }
        
        return null;
        
    }

}

 

Step 05: 依 struts.xml 裡指示,建立一個 Action class:PointConverterAction

package com.test;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author polin.wei
 *
 */
public class PointConverterAction extends ActionSupport {

    private Point point;
    private Point point1;
    private int age;
    private String username;
    private Date date;
    
    public Point getPoint() {
        return point;
    }
    public void setPoint(Point point) {
        this.point = point;
    }
    
    public Point getPoint1() {
        return point1;
    }
    public void setPoint1(Point point1) {
        this.point1 = point1;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        
        return SUCCESS;
    }
    
    
}

 

Step 06:在類型轉換有分成區域性及全域性,若是區域性則在 Action class:PointConverterAction 相同的 package: com.test 下需建立一個檔案 PointConverterAction-conversion.properties (-conversion.properties 是固定的,此檔用來指示 struts2 那一個欄位,[ 如:input.jsp 中的 point 欄位] 在作 setPoint()/getPoint() 前,要先使用此自定義類型 [如: com.test.PointConverter ] 作轉換 );若是全域性:則在 struts.xml 檔案相同目錄下需建立一個檔案:xwork-conversion.properties 來指示 struts2 那一種類型 [如:com.test.Point] 均使用那一個 class [如:com.test.PointConverter ]來作類型轉換。

 

PointConverterAction-conversion.properties 的內容如下:

point=com.test.PointConverter

 

xwork-conversion.properties 的內容如下:

com.test.Point=com.test.PointConverter
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()