2008年9月29日 星期一

PostgreSQL--(三)備份與回復

1. 備份
$> pg_dump --format=c --file=test1.out pyarddb
gt; pg_dump --format=c --file=test1.out pyarddb
--format:select format of output file(p:plain-text, t:tar-archive, c:custom-archive)
--file:specify output file
2. 回復
$> pg_restore --dbname=pyarddb pyard.backup
gt; pg_restore --dbname=pyarddb pyard.backup
--dbname: select the database and restore into the database

2008年9月26日 星期五

PostgreSQL--(二)Server配置&建立資料庫

1. 允許本機以外的遠端登入連線
$> vi postgresql.conf
listen_addresses = '*'
2. 遠端登入資料庫的權限控制
$> vi pg_hba.conf
host all all 192.168.x.0/24 trust

3. 建立使用者帳號
$> createuser -s -l -P -e yardmgr
-s:be superuser -l:be allowed to log in -P:specify password -e:echo message
4. 建立資料庫
$> createdb -O yardmgr -e pyarddb
gt; createdb -O yardmgr -e pyarddb
-O:specify user own the new database -e:echo message

2008年9月25日 星期四

PostgreSQL--(一)安裝與設定

1. 下載PostgreSQL, 並且解壓縮至/usr/目錄中
$> mkdir /usr/src/postgresql
$> cp postgresql-8.x.x.tar.gz /usr/src/postgresql
$> tar -zxvf postgresql-8.x.xx.tar.gz
2. 安裝PostgreSQL
$> su - root
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> ./configure
--prefix: specify installation directory, default is /usr/local/pgsql
--with-pgport: set the port number, default is 5432
--with-pam: build the pam support

$> gmake
$> gmake install
3. 建立postgres帳號, 並建立存放資料庫的目錄
$> adduser postgres
$> mkdir /usr/local/pgsql/data
$> chown postgres /usr/local/pgsql/data
4. 函式庫設定
$> vi /etc/profile
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH

$> /sbin/ldconfig /usr/local/pgsql/lib
5. 環境變數設定
$> su - postgres
$> vi .bash_profile
PATH=$PATH:/usr/local/pgsql/bin
export PATH
MANPATH=/usr/local/pgsql/man:$MANPATH
export MANPATH
PGDATA=/usr/local/pgsql/data
export PGDATA
6. 資料庫叢集(Database Cluster)初始化
##以postgres帳號登入執行..
$> initdb -D /usr/local/pgsql/data
7. 啟動伺服器
##啟動服務, 並且記錄其訊息輸出及錯誤訊息
$> postgres -D /usr/local/pgsql/data >logfile 2>&1 &

$> pg_ctl start -D /usr/local/pgsql/data -l logfile

##以root身份登入
$> /etc/init.d/postgresql start
8. 查看伺服器有無正常運作
##須設定環境變數PGDATA
$> pg_ctl status

##輸出訊息
pg_ctl: server is running (PID: 3974)
/usr/local/pgsql/bin/postgres "-D" "/usr/local/pgsql/data/"
9. 設定開機時, 自動啟動PostgreSQL服務
#以root權限登入
$> vi /etc/rc.d/rc.local
if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then
su postgres -c '/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data -l /usr/local/pgsql/data/serverlog -s'
echo -n 'postgresql server is running...'
fi

cp /usr/src/postgresql/postgresql-8.x.xx/contrib/start-scripts/linux /etc/init.d/postgresql
chkconfig --add postgresql
8. Shared Memory配置
$> sysctl -w kernel.shmmax=134217728
$> sysctl -w kernel.shmall=2097152
9. 關閉伺服器
$> pg_ctl stop

$> kill -INT 'head -1 /usr/local/pgsql/data/postmaster.pid'

##以root身份登入
$> /etc/init.d/postgresql stop
10.解除安裝
##註:不會自動刪除已建立的目錄##
$> cd /usr/src/postgresql/postgresql-8.x.xx/
$> gmake uninstall

2008年9月23日 星期二

如何讓PostgreSQL擁有更好的效能??

下列三個主要方面可以提升 PostgreSQL 的效能::

1.查詢方式的變化
這主要涉及修改查詢方式以獲取更好的性能:
  • 創建索引,包括表達式和部分索引;
  • 使用 COPY 語句代替多個 Insert 語句;
  • 將多個SQL語句組成一個事務以減少提交事務的開銷;
  • 從一個索引中提取多條記錄時使用 CLUSTER;
  • 從一個查詢結果中取出部分記錄時使用 LIMIT;
  • 使用預編譯式查詢(Prepared Query);
  • 使用 ANALYZE 以保持精確的優化統計;
  • 定期使用 VACUUM 或 pg_autovacuum
  • 進行大量資料更改時先刪除索引(然後重建索引)

2.伺服器的配置
配置文件 postgres.conf 中的很多設置都會影響性能,所有參數的列表可見:

管理員指南/資料庫伺服器運行環境/資料庫伺服器運行配置, 有關參數的解釋可見:http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.htmlhttp://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html

3.硬體的選擇
電腦硬體對性能的影響可瀏覽 http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.htmlhttp://www.powerpostgresql.com/PerfList/

PostgreSQL為何一定要做Vacuum呢?

無庸置疑,PostgreSQL的更新性能是一大問題。

PostgreSQL更新處理的弱點
PostgreSQL採用追加型的架構,更新的時候,在數據庫內部刪除行之後再追加新行。刪除掉的行由VACUUM命令作為可以再利用區域回收,然後被再利用。如果頻繁進行更新處理也必須讓VACUUM頻繁運行,不然廢棄區域會不斷增加導致數據表肥大化而致使性能惡化。
VACUUM需要掃瞄數據表的全部數據,所以數據表越大處理時間越長。因此,如果數據表很大而且更新又很頻繁,那麼無論怎麼頻繁運行VACUUM也來不及回收更新處理產生的廢棄區域。
然而問題不僅如此,更新處理不僅僅是針對數據表本身,索引也必須同時更新。PostgreSQL的某個列被更新的話,關聯索引也需要全部更新。因此,擁有大量索引的數據表的更新處理量將會特別大,索引也會越來越肥大化。索引的廢棄區域也因此難於被VACUUM回收再利用,比數據表的問題更加嚴重。

假設有如下一個管理網頁訪問次數的簡單數據表,當某個URL被訪問時cnt增加計數,這是一個頻繁更新的典型案例。
CREATE TABLE t1(
url TEXT PRIMARY KEY,-- 主鍵,自動附加索引
cnt INTEGER
);
cnt更新時,url字段的關聯索引也會被更新。
考慮一下cnt發生變更而url沒有變化的情況,這時url的索引更新是沒有必要的。

使用VACUUM抑制數據表的廢棄領域
更新cnt時,這行 數據被刪除(正確地說是在這個時刻變得不可見),然後追加新的數據行。被刪除的行中放置一個被刪除標誌,以及一個指向新行的指針。再次更新這行數據時,從 舊行的指針很容易找到新行,然後用上邊提到的同樣方式在這裡放置指向新行的指針。這樣反覆更新的話就會形成一個指針鏈,叫做更新鏈(UPDATE chain)。
更新鏈越長檢索和更新花費的時間就越長,直到運行VACUUM才會消除這種影響,這是現在PostgreSQL的問題點。

原文出處:
The ‘MV’ in MVCC (Multiversion Concurrency Control) stands for Multi Version. This means that multiple versions of the same data will be kept any time that data changes. Oracle does this by rolling old data into an "undo log." PostgreSQL doesn't use an undo log; instead it keeps multiple versions of data in the base tables. This means that there is much less overhead when making updates, and you must occasionally remove the old versions. This is one of the things VACUUM does.

The way PostgreSQL manages these multiple versions is by storing some extra information with every row. This information is used to determine what transactions should be able to see the row. If the row is an old version, there is information that tells PostgreSQL where to find the new version of the row. This information is needed to be able to lock rows during an update.

Consider this scenario: a row is inserted into a table that has a couple indexes, and that transaction commits. Several updates happen on that row. Each update will create a new row in all indexes, even if the index key didn't change. And each update will also leave an old version of the row in the base table, one that has been updated to point to the location of the new version of the row that replaces it. All of the old data will stick around until the vacuum is run on that table. In a busy system, it doesn't take very long for all the old data to translate into a lot of wasted space. And it's very difficult to reclaim that space if it grows to an unacceptable level.

What this means to those who want to keep their PostgreSQL database performing well is that proper vacuuming is critical. This is especially true on any tables that see a heavy update (or insert/delete) load, such as a table used to implement some kind of a queue. Such tables should generally be vacuumed frequently if they are small--more frequently than autovacuum normally would provide. For more moderate loads, autovacuum will often do a good job of keeping dead space to a minimum.



2008年9月7日 星期日

快速設定WinForm上任何控制項TabIndex的順序

.,由於在設計 Form 上的控制項時,不一定會依照輸入的順序,在完成設計之後,我們通常會重設各控制項的 TabIndex 順序,當 Form 上的控制項比較多時,設定起來相當麻煩,常常還會設錯。

有一個很簡單又不容易出錯的方法,是從畫面上的右下角往左上角 (方向是先向左再往上),逐一的將控制項的 TabIndex 屬性設成 0。
1:右手用滑鼠點一下右下角的控制項,左手按 F4,將 TabIndex 設成 0。
2:右手往左用滑鼠點一下倒數第二個控制項,左手按 F4,左手按 0。
3:右手往左用滑鼠點一下倒數第三個控制項,左手按 F4,左手按 0。
4:重複以上動作直到左上角第一個控制項為止。

好了,您已設定好整個 Form 上任何控制項的 TabIndex 順序了!其原理就是當您設定一個控制項的 TabIndex 為 0 時,原來 TabIndex 為 0 的控制項,TabIndex 就變成了 1、而 1 的變成 2...依序 +1 改變。

.Net Framework的新元件 -- DataGridView

在偶然的情況下, 才突然發現VB.Net 2005/2008的視覺控制項, 竟找不到DataGird元件, 取而代之的是DataGridView, 頗令人好奇這個新控件, 到底提供了什麼樣的差異化功能??

1.Windows Form DataGridView 和 DataGrid 控制項之間的差異
2.DataGridView 控制項概觀 (Windows Form)
3.DataGridView 控制項 (Windows Form)


先備記上面來自於MSDN的技術文件供往後參考!!