Archive

‘Database’ 分類過的Archive

Oracle 9i 搬移資料庫

2009年8月25日 尚無評論

因為專案關係,客戶提供了資料庫實體檔案給我們,並非提供備份檔,所以這就麻煩多了;因此先問過待在Oracle的好同學,再加上自己亂搞總算弄起來啦~~,以下是設定的步驟,有需要的人加減看一下吧!!

Oracle的好同學提醒要注意的事項: (感恩喔!!  友情真正好呀!)

1.不能只拿到dbf檔案,是要拿整個database 存放資料實體的目錄 ,預設路徑是在c:\oracle\oradata
2.除了實體資料的檔案外,還要拿參數檔才行 ,預設路徑是在c:\oracle\admin\pfile\init.ora.xxxxxxxx
3.還有資料庫的版本要一樣才行,連patch 也要一樣才行!!

照著方法建立後,啟動資料庫還是發生了 ORA-01219:數據庫未打開:僅允許在固定表/視圖中查詢 的錯誤訊息
再來就是自己亂搞的了,上網查一下資料:

如是刪掉了DBF文件出現ORA-01219,用以下方法解決:

以sysdba登錄:
C:\>sqlplus “/ as sysdba”
SQL> alter database datafile 'DBF文件所在的路徑' offline drop;
數據庫已更改。
SQL> alter database open;
數據庫已更改。

而小弟則是:

sqlplus /nolog
connect / as sysdba
alter database open;
資料庫已更改。

然後重啟Oracle 服務,再利用 Oracle enterprise management 進入查看….
哈~~哈~~大功告成!!  下課!!

Categories: Database Tags:

MS SQL Server 設定Trigger 語法

2009年5月13日 尚無評論

今天剛好有網友詢問如何設定MSSQL Server 的Trigger
所以就把相關設定寫下來

這trigger 的動作是希望在有異動資料時
能將原本的資料及異動的資料都寫到log 去

所以就如下面這串啦

CREATE TRIGGER tritest ON [dbo].[fee]
FOR Update
AS
   INSERT INTO [dbo].log1(modifier,updateTime) SELECT modifier, GETDATE() FROM INSERTED
  INSERT INTO [dbo].log2(modifier,updateTime) SELECT modifier, GETDATE() FROM DELETED

這和Mysql 不太一樣的是 sqlserver提供了inserted及deleted 兩個temp table,當有異動資料觸發時
inserted會放新的資料而deleted會保有被修改或被刪除的資料

Categories: Database Tags: ,

MySQL Trigger 簡單介紹用法

2008年12月17日 尚無評論

最近在服務一個舊客戶的系統,發現先前父子架構的關連,父table刪除時程式並未刪掉子table 相關的資料
所以導致出現了問題,原先設計並未使用foreign key及trigger,想要快速排除此問題又不想在程式加上code
最好還是加上foreign key或trigger吧…

在複雜的架構下,foreign key的使用會造成資料在維護上之不便,以先前開發的大型系統為例,資料庫是Oracle,一個rawdata table有關的table有二三十個,每個table 都是百萬筆起跳的,當全部關連都使用 foreign key時,問題來啦,當要刪除rawdata時,慢的和烏龜一樣,就算Oracle是裝在8 顆Cpu主機上也是一樣,所以如有這種狀況,改用Trigger或許是個好方法,不過前提還是要看你要做什麼事而定,如果只是刪父table資料時順便把相關的子table資料刪除時,這是一個好方法,使用方法如下:

CREATE TRIGGER test_tri BEFORE DELETE ON orders
  FOR EACH ROW BEGIN
  DELETE FROM orders2 WHERE orderid = OLD.id; 
  END

上述例子就下在刪除父table資料時會觸發一併刪除子table相關連的資料

trigger 觸發時間有上述例子使用的 before 還有after 主要是在發生delete , insert,update 之前或之後進行處理
FOR EACH ROW 是說明 對每一筆進行 用BEGIN …..END 將我們要執行的項目寫入
其中還可以包含邏輯運算式,以增加trigger 的使用彈性

在上例子有個OLD.id,這在trigger 裡面是有特殊意義的,這個OLD.id表示原本就存在資料庫的欄位資料
因為我們例子是在DELETE觸發,所以要用OLD,而NEW.id 當然就是指觸發時欄位的新資料,一般是用在insert及update 上

簡單介紹使用方式,如有想要知道更多,請參考以下網頁:

Categories: Database Tags: ,

笛卡兒乘積(Cartesian product) 的瞭解

2008年8月3日 尚無評論

最近在看一些資料庫的文章時,常會提到笛卡兒乘積(大陸譯:迪卡爾積),大概知道他是在說Cross Join就是 A table 乘上 B table的意思,不過還是想更瞭解,所以上網找了一下資訊:

笛卡兒事蹟 
笛卡兒是歐洲16~17世紀的偉大法國數學家(他也是一位哲學家,也有人稱之為近代哲學之父),他以解析幾何而聞名於世,他也是第一個發現直角座標的人,並且有一句「我思故我在」的名言傳世,最讓人津津樂道的是,他與學生公主的數學愛情故事(有興趣者請參考 連結1 連結2 )

Wiki  笛卡兒乘積解釋
數學中,兩個集合 XY笛卡兒積Cartesian product),又稱直積direct product),表示為 X × Y,是其第一個構件是 X 的成員而第二個構件是 Y 的一個成員的所有可能的有序對
想了解更多該理論,請點此

資料庫中的說明
一般在關聯式資料庫中要滿足一個查詢往往要結合兩個表或多個表,兩個資料表在結合時,不指定任何條件,即將兩個資料表中所有的可能排列組合出來,就稱做卡笛兒乘積(Cartesian product)。
此運算結合起來稱為交叉結合(CROSS JOIN)。我們只要使用Select敘述配合 [CROSS JOIN] 關鍵字就可以達成(CROSS 可以省略不寫)。

相關參考:
http://www.csjh.tpc.edu.tw/~doing/h-edu-date/edu-d-date/edu-d-1/1-7.htm
http://webdesign.enjoyitsimply.com/archives/category/sql
http://zh.wikipedia.org/wiki/%E7%AC%9B%E5%8D%A1%E5%84%BF%E7%A7%AF
http://blog.xuite.net/crdotlin/excel/9055925
http://blog.bsjh.tcc.edu.tw/post/21/133
http://www.wretch.cc/blog/a331776/26457400

Categories: Database Tags:

Mysql 備份還原

2008年7月12日 尚無評論

目前碰到使用最頻繁的資料庫  就是Mysql了
所以彙整並演練一下 備份還原

使用MYSQL進行資料庫備份,它本身就有提供資料庫備份方式,但也有一些小方法也可以快速備份。
可透過MySQL的mysqldump工具進行備份,基本用法是:

mysqldump [OPTIONS] database [tables]

如果你不給定任何Table,整個資料庫將被備份匯出。
通過執行mysqldump –help,你能得到你mysqldump的版本支援的選項列表。 注意,如果你運行mysqldump沒有–quick或–opt選項,mysqldump將在備份匯出結果前裝載整個結果集到記憶體中,
如果你正在備份匯出一個大的資料庫,這可能會產生錯誤而失敗。

mysqldump支援下列選項:

–add-locks
在每個Tabel備份匯出之前增加LOCK TABLES並且之後UNLOCK TABLE。(為了使得更快地插入到MySQL)。

–add-drop-table
在每個create語句之前增加一個drop table。

–allow-keywords
允許創建是關鍵字的列名字。這由在列名前面加Tabel名的方法做到。

-c, –complete-insert
使用完整的insert語句(用列名字)。

-C, –compress
如果Client和Server均支援壓縮,壓縮兩者間所有的資訊。

–delayed
用INSERT DELAYED命令插入行。

-e, –extended-insert
使用全新多行INSERT語法。(給出更緊縮並且更快的插入語句)

-#, –debug[=option_string]
跟蹤程式的使用(為了調試)。

–help
顯示一條幫助消息並且退出。

–fields-terminated-by=…
–fields-enclosed-by=…
–fields-optionally-enclosed-by=…
–fields-escaped-by=…
–fields-terminated-by=…
這些選擇與-T選擇一起使用,並且有相應的LOAD DATA INFILE子句相同的含義。
LOAD DATA INFILE語法。

-F, –flush-logs
在開始備份匯出前,洗掉在MySQLServer中的日誌檔。

-f, –force,
即使我們在一個Tabel備份匯出期間得到一個SQL錯誤,繼續。

-h, –host=..
從命名的主機上的MySQLServer備份匯出資料。預設主機是localhost。

-l, –lock-tables.
為開始備份匯出鎖定時所有Tabel。

-t, –no-create-info
不寫入Tabel建立資訊(CREATE TABLE語句)

-d, –no-data
不寫入Tabel的任何行資訊。如果你只想得到一個Tabel的結構的備份匯出,這是很有用的!

–opt
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。
應該給你為讀入一個MySQLServer的盡可能最快的備份匯出。

-pyour_pass, –password[=your_pass]
與Server連接時使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來自終端的口令。

-P port_num, –port=port_num
與一台主機連接時使用的TCP/IP埠號。(這用於連接到localhost以外的主機,因為它使用 Unix套接字。)

-q, –quick
不緩衝查詢,直接備份匯出至stdout;使用mysql_use_result()做它。

-S /path/to/socket, –socket=/path/to/socket
與localhost連接時(它是預設主機)使用的套接字檔。

-T, –tab=path-to-some-directory
對於每個給定的Tabel,創建一個table_name.sql檔,它包含SQL CREATE 命令,和一個table_name.txt檔,它包含資料。 注意:這只有在mysqldump運行在mysqld守護進程運行的同一台機器上的時候才工作。.txt檔的格式根據–fields-xxx和–lines–xxx選項來定。

-u user_name, –user=user_name
與Server連接時,MySQL使用的用戶名。預設值是你的Unix登錄名。

-O var=option, –set-variable var=option
設置一個變數的值。可能的變數被列在下面。

-v, –verbose
冗長模式。列印出程式所做的更多的資訊。

-V, –version
列印版本資訊並且退出。

-w, –where='where-condition'
只備份匯出被選擇了的記錄;注意引號是強制的!

看了上面那麼多參數說明,要詳讀很麻煩
所以還是看快速版,一般最常用的大致指令如下:

備份

mysqldump -u root  -p -F –opt yourDB > backup-yourDB.sql

還原

mysql yourDB -u root -p < backup-yourDB.sql

使用起來還蠻快速的,有空再來練習寫個script 排入crontab 即可定期自動備份

當然也有非正規方式的備份方式,就是直接到Mysql存放實體位置把整個Data 目錄都copy 下來
不過他是非正規的,建議DB最好先shutdown 比較好
還有要注意Data 目錄之中,如果你只要copy 單db的目錄 只限於MYISAM 型態的DB 如果你是INNODB
你還要包含Data 下的那些ibdata 為字首的檔名,不然你等於只備份個DB Schema

參考資料來源 :
http://dz.adj.idv.tw/archiver/tid-157.html
http://www.study-area.org/tips/mysql_backup.htm
http://www.neo.com.tw/archives/001122.html

Categories: Database Tags: ,
分頁: 上一頁 1 2 3 4 下一頁