postgresql 數據庫的初始化,配置,備份和還原

創建database

liaoxinxi@tbase /home/liaoxinxi/trunk $ createdb -e -E utf8 -O tbaseuser -U postgresql -T template0 tplbase
CREATE DATABASE tplbase OWNER tbaseuser ENCODING 'utf8' TEMPLATE template0;

-U postgresql是用戶名,是需要的,否則就會用操作系統的用戶名

-T template0採用模板0,創建數據庫的過程就是複製數據庫的過程,默認是template1,在template1的情況下,在創建數據後,在template1安裝的東西會拷貝到根據template1創建的數據庫,而template0則不存在這種情況,其實template0和1的內容是一樣的。所以在psql恢復數據的時候很好。

CREATE DATABASE 實際上是通過拷貝一個現有的數據庫進行工作的。 缺省時,它拷貝名字叫 template1 的標準系統數據庫。 所以該數據庫是創建新數據庫的"模板"。如果你給 template1 增加對象,這些對象將被拷貝到隨後創建的用戶數據庫中。 這樣的行爲允許節點對數據庫中的標準套件進行修改。 比如,如果你把過程語言 PL/pgSQL 安裝到 template1 裏,那麼你在創建用戶數據庫的時候它們就會自動可得,而不需要額外的動作。
系統裏還有第二個標準的系統數據庫,叫 template0。 這個數據庫包含和 template1 一開始時一樣的數據內容, 也就是說,只有你使用的版本的 PostgreSQL 標準的對象。在 initdb 之後,我們不應該對 template0 做任何修改。通過告訴 CREATE DATABASE 使用 template0 而不是 template1 進行拷貝, 你可以創建一個"純淨"的用戶數據庫,它不會包含任何 template1 裏節點所特有的東西。 這一點在恢復 pg_dump 轉儲的時候是非常方便的: 轉儲腳本應該在一個純潔的數據庫中恢復以確保我們創建了被轉儲出的數據庫中的正確內容, 而不和任何現在可能已經存在在 template1 中的附加物相沖突

配置數據庫

$/etc/init.d/postgresql restart  

$psql tbase 直接進入tbase

1,
listen_addresses = 'localhost' postgresql.conf 設置本地可tcp鏈接
2,
/etc/postgresql/8.4/main/pg_hba.conf 設置可訪問
local all postgres trust
進入數據庫後 psql tbase
\password 設置數據庫密碼,我不知道在createdb使用的密碼爲什麼不管用,一定得用這個才能鏈接上數據庫
>>> db = psycopg2.connect(user='postgres',password='shengqi158',database='tbase', host='localhost')
>>>


\encoding
獲取編碼格式
當前client的編碼
SHOW client_encoding;
對於一些已知的編碼,在客戶端和服務器端實現自動轉碼
\c - newuserl來切換用戶,- 表示數據庫不變 \c用於切換用戶和數據庫 \du 列出用戶,\l列出數據庫,
\d 回車將得到所有表
initdb 命令將會創建數據庫族,--encoding=encoding指定服務端的編碼,也可在創建數據庫的時候指定encoding
如果服務器字符集是 SQL_ASCII, 服務器把字節值 0-127 的數值根據 ASCII 標準解析,而字節值未 128-255 的則當作未解析的字符,在大多數情況下,如果你使用了任何非 ASCII 數據,那麼使用 SQL_ASCII 設置都是不明智的,因爲 PostgreSQL 會無法幫助你轉換或者校驗非 ASCII 字符。就存在部分以16進製表示
SQL_ASCIIany (no conversion will be performed)


UTF8all supported encodings
對於服務器端採用utf8還是sql-ascii編碼都不影響order by和like

show server_encoding 獲取服務端編碼
show client_encoding 獲取客戶端編碼
character varying(4) 這個4是字符,不是字節數,
len(s) 測試的字節數
char(n) 則是指定長度,沒填滿的話填充空白,比較或者轉換的時候那些空白字符不會被關注
varchar(n),不會填充空白
text,允許的最長字符達到1G
在性能上,postgre對這三種數據類型沒有性能差異,其他的數據庫系統可能有
一般想存儲沒有特定上限的字符串一般採用text

select name from student where name like '%sdu%';
數據庫備份還原命令
pg_dump -h 164.82.233.54 -U tbaseuser databasename > databasename.bak
恢復:pg_restore -h localhost -U tbaseuser -d databasename < databasename.bak
-h 代表目標主機,localhost代表本地主機,-U 用戶,-d數據庫名
\h alter table 
insert into init_cmd(cmd, check_type, platform_id) values('su - root\npasswd', 'UNIX',5);
insert into param(quote,display,type,"desc") values('apache_conf_path','apache配置文件路徑','text','apache的配置路徑'); 
desc關鍵字,加雙引號,後邊的值必須是單引號(有的時候)
select * from pg_stat_activity;查看鏈接情況
alter database tbase RENAME TO tbase_ascii;
alter table template add column industry character(10);

Template Databases

liaoxinxi@tbase /home/liaoxinxi/trunk $ pg_dump -h localhost -U postgresql tbase > tbase.bak
liaoxinxi@tbase /home/liaoxinxi/trunk $ psql -d tbase -U tbaseuser< tbase.bak

psql -d tbase -U tbaseuser -f tbase.bak

pg_dump -h localhost -p 5432 -U tradesns -W -F c -b -v -f "/home/tradeworkwangbin/us2010.backup" us2010
恢復:pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v "/root/us2010.backup"

pg_dump -h localhost  -p 5432 -U tbaseuser tbase -F c -b -v -f tbase.bak

pg_restore -h localhost -p 5432 -d tbase -U tbaseuser tbase.bak

-F 壓縮格式,c表示很靈活的格式 -b大對象,客戶化格式的轉儲不是腳本,不能用於 psql

http://www.cnblogs.com/wangbin/archive/2009/08/14/1546009.html

爲了支持遠程訪問(默認關閉),必須在pg_hba.conf(/usr/bin/pgsql/data)添加 
host all all 192.168.0.0/16 trust #該網段可信
然後在postgresql.conf添加listen_address = '*'
重啓:pg_ctl restart -D /usr/bin/pgsql/data
ps -elf|grep post
netstat -anp|grep 5432
主鍵,外鍵,索引,唯一索引
主鍵,一個表的唯一標誌,保證數據的唯一性,一般是讓主鍵只幹主鍵的事
外鍵,主要用於關聯和限制,一般是外表的主鍵,也可以是unique約束,另外控制主表的插入,必須有相應的外鍵,另外外表的刪除肯定會查詢主表,如果還有的話是不能刪除的,這就保證了依賴關係,但同時帶來了效率的下降。
當一個表中引用另外一個表的主鍵時,這個時候這個主鍵就成了主表中的外鍵

數據庫的約束有三種,實體完整性約束、參照完整性約束和用戶自定義約束。

1.實體完整性約束指的是主鍵不能爲空,如果主鍵爲空了還怎麼唯一標識一條記錄。

2.參照完整性約束,即外鍵的約束,某一外鍵的值必須在它引用的主鍵字段中存在。如,學生表中專業編號屬性的值,必須都存於專業信息表中的專業編號屬性中。想一想也就明白了,一個學生(大學生)怎麼可能屬於一個不存在的專業。

3.用戶自定義完整性約束,指的是一些用戶自己設定的約束,例如字段是否可以爲空,字段值的取值範圍(如:人的性別只能取男、女)

創建表的時候就創建了索引,那個索引就是主鍵

索引的目的就是爲了加快查詢速度設立的

ALTER TABLE pc ADD CONSTRAINT fk_cpu_model
FOREIGN KEY (cpumodel)
REFERENCES parts(model)

on update cascade;

第一行是設置外鍵約束並命名,第二行則是設置本表的字段,第三行則是關聯的外表的約束,

ON UPDATE CASCADE; 即在主表更新時,子表(們)產生連鎖更新動作,似乎有些人喜歡把這個叫“級聯”操作。:) CASCADE 外,還有 RESTRICT(禁止主表變更)、SET NULL(子表相應字段設置爲空)

CREATE INDEX <索引的名字> ON tablename (列的列表);設置簡單索引
CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);設置爲一索引,只出現一次,還有多列索引,
ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);

數據庫中主鍵和外鍵的設計原則

複合主鍵常常導致不良的外鍵

postgres@liaoxinxi-ThinkPad-SL400:/usr/bin$ createdb -e -E 'utf8' -T template0 -U postgres -w -O postgres tbase
CREATE DATABASE tbase OWNER postgres ENCODING 'utf8' TEMPLATE template0;

ident

增加unique約束:

tbase=# alter TABLE platform add constraint name_chk unique (name);
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "name_chk" for table "platform"
ALTER TABLE

去除外鍵:

tbase=# alter TABLE t_item DROP CONSTRAINT t_item_id_field_fkey;
ALTER TABLE


alter TABLE item ADD column user_id integer;

http://man.ddvip.com/database/PostgreSQL80zhref/index.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章