星期五, 十月 17, 2008

单机环境下vmware与本机操作系统共享adsl网络设置

单机环境,ADSL拨号上网,安装VMware后,客户机如何与宿主机共享上网?朋友老问这个问题,其实已经不是什么新问题了。为了方便大家还有新手,今天有功夫就写下来,希望方便大家参考。为了具有针对性,我就拿自己的机器做为参照对象。

Product:VMware WorkStation(英文版)
Version:6.0.0 build-45731
硬件配置:三星Q70-AV01笔记本、Intel Core2 Duo(Merom) T7300(2.0G)、DDR2
667(2G)
宿主机系统:Microsoft Windows XP Professional Service Pack 2 (原版)
客户机系统:Fedora 7 Linux
上网方式:北京网通ADSL(512K)、无路由器、Modem也无路由功能。利用XP自带的PPPoE宽带拨号软件新建名为"ADSL"的连接拨号上网。

网络适配器及其配置:
VMware Network Adapter VMnet8:
IP Address. . . . . . . . . . . . : 192.168.168.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0

VMware Network Adapter VMnet1:
IP Address. . . . . . . . . . . . : 192.168.58.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0

本地连接(物理网卡):(自动获取IP地址和DNS)
ADSL(PPPoE) :(由XP新建网络连接向导获得)

以下仅介绍Bridged和NAT两种共享上网方式:
准备工作(必须):为客户机Fedora 7 Linux系统安装VMware Tools

一、Bridged方式共享上网

1、关闭管理工具--服务中的VMware DHCP Service和VMware NAT Service两个服务
2、先断开ADSL连接,控制面板--网络连接--ADSL属性--高级-勾选"Internet连接共享",下拉列表中然后选择"本地连接"。确定,不 要管提示。系统会自动把"本地连接"设置为
192.168.0.1,子网掩码设置为255.255.255.0. 以后192.168.0.1这个IP地址就是Fedora
7 Linu的默认网关地址和DNS地址了。
3、连接ADSL并拨号,启动Fedora 7 Linux,设置IP和DNS
IP设置为192.168.0.X (X就是2到254之间的数都可以)
子网掩码255.255.255.0
网关192.268.0.1
DNS:192.168.0,1
之后重启Fedora 7 Linu或重新激活网络就可以上网了(注意:Linux网络必须激活才能使用,好多人改了配置都不激活,肯定上不了网,时刻检查一下网络是否处于激活状态,而且必须设置为计算机启动时候就激活设备)

二、NAT方式共享上网

1、开启管理工具--服务中的VMware DHCP Service和VMware NAT Service两个服务
2、取消ADSL连接的Internet连接共享。
3、连接ADSL并拨号,启动Fedora 7 Linux,设置IP和DNS
IP设置为192.168.58.X (X就是128到254之间的数都可以)
子网掩码255.255.255.0
网关192.268.58.2
DNS:192.168.58.2
之后重启Fedora 7 Linu或重新激活网络就可以上网了.

提示:或者更简单的办法就是,开启管理工具--服务中的VMware DHCP Service和VMware
NAT Service两个服务后,直接把客户机中的网络设置为DHCP获取IP方式,即可上网
这里需要注意的是VMware对于VMnet8采用如下规则(就以本机的192.168.58.0网段为例):


第一个地址(192.168.58.1):静态地址,分配给了宿主机Xp的VMware Network Adapter
VMnet8适配器使用。
第二个地址(192.168.58.2):静态地址,分配给了NAT设备使用。
(192.168.58.3192.168.58.127)静态地址,保留。
(192.168.58.128192.168.58.254):DHCP作用域地址范围,分配给虚拟机使用。
最后一个地址(192.168.58.255)广播地址。
VMware默认安装后的规则都是如此。

单机ADSL拨号环境,不是路由器或是局域网环境,ADSL的Internet连接共享这步是选择Bridged方式共享上网的关键

如果你还想宿主机和客户机之间能相互Ping通和共享,就先把"文件和打印机共享"添加到Windows防火墙例外,然后把管理工具--服务中的Server、Computer Browser、两个服务打开。

关于GuestOS共享主机文件
选择你的Guest OS
点击Edit virtual machine settings--->Options-->Shared Folders

选择Always enables,然后点 Add 选择你要共享的主机磁盘或文件夹

FreeBSD下USB打印机的安装经验谈

使用的是HP DeskJet 3420,所以我只能说安装这台打印机的经验了。供你们参考吧!
1、编译内核
在安装打印机前先检查内核看看内核中是否支持USB端口。
如果没有就加入如下:
#USB Stuff
device usb
device uhci
device ulpt
如果你无法确认是uhci还是ohci你可以使用dmesg命令查看:
#dmesg | less
或者直接输入下面:
#dmesg | grep uhub

2、编辑rc.conf

内核编译结束后编辑/etc/rc.conf,
添加如下内容: usbd_enable="YES"

3、重新启动计算机,以启用新内核。

4、查验设备节点

这时你到 /dev下看看是否存在ulpt0这个文件,
如果没有就需要用如下方式创建他:
#cd /dev #/dev/MAKEDEV ulpt0

5、安装打印机软件和驱动。
我安装了如下软件:
/usr/ports/print/Ghostscript-gnu
/usr/ports/print/hpijs
/usr/ports/print/apsfilter
/usr/ports/print/cups
/usr/ports/print/foomatic-db
下面的这个我没装: /usr/ports/print/foomatic-db-engine
但我还是建议你在安装cups之前安装上他们。
我直接下载了foomatic-rip和foomatic-gswrapper到/usr/local/bin目录(你也可以到http://www.Linuxprinting.org上下载 foomatic-filters的packages到本地进行安装): #cd /usr/local/bin #fetch
http://www.linuxprinting.org/foomatic-rip
#fetch
http://www.linuxprinting/foomatic-gswrapper
然后运行如下命令:
#chmod 755 foomatic-rip foomatic-gswrapper
#ln -s /usr/local/bin/foomatic-rip
/usr/local/libexec/cups/filter/foomatic-rip
好了该准备我的打印机驱动了,
我的打印机是HP Deskjet 3420。驱动可以在如下网址搜索到(这里有很多品牌打印机驱动的哦!):
http://www.linuxprinting.org/printer_list.cgi 驱动是PPD文件,
将PPD文件下载到/usr/local/share/cups/model,
然后对其设置权限:
chown root:wheel HP-DeskJet_3420-hpijs.ppd
chmod 644 HP-DeskJet_3420-hpijs.ppd

6、准备工作结束,

现在开始配置打印机。 打开浏览器在地址栏输入:
http://localhost:631
或者 http://localhost:631/admin
如果你是用的前者进入,那么你进入页面中的如下链接"Do Administration
Tasks",这时你需要输入管理员名称(User Name)和密码(PassWord)。如果你用后者进入则会直接要求输入管理员名称(User Name)和密码(Password)。
我的:http://127.0.0.1:631 或者 http://127.0.0.1:631/admin
我用的后者。管理员名称(User Name)用你机器的超级管理员root ,密码(Password)当然就是root的密码了!
第一次使用CUPS当然要点击 Add Printer 了。
之后出现一个表单,表单的含义如下(以我的HP Deskjet 3420为例):
Name:3420 (你喜欢怎么叫你的打印机呢?)
Location:Local printer (就这么填就行了!)
Description:hp DeskJet3420 (描述一下你的打印机)
然后点Continue按钮,现在的这个界面是打印机联接端口的选择。
我的选择的是: USB Printer #1
然后点Continue按钮,现在的这个界面是选择打印机厂商的界面,
我的当然选择:HP了。
然后点Continue按钮,好了仔细寻找和你打印机匹配的驱动吧。
我选择HP DeskJet 3420 Foomatic/hpijs (recommended) (en)。
然后点Continue按钮结束配置。

7、启动CUPS 先su到超级管理员,
之后执行如下操作:
#/usr/local/etc/rc.d/cups.sh start OK,
现在你用如下命令测试一下:
#lp <文件名(可以自己编辑一个小文本文件)>

8、OpenOffice的打印机配置

使用如下命令: $openoffice-1.1-spadmin
在弹出窗口中点击"新增打印机"。
在新窗口中选中"配置一个打印机"。
点击"继续"后在新窗口中看看已有的驱动中是不是有和你打印机匹配的。
如果有就选中然后点击继续。如果没有,点击"输入"按钮。
在新弹出的窗口中在如下目录中搜寻打印机驱动:
/usr/local/etc/cups/ppd/ 应该找到了吧,
一路"确定"、"继续"就OK了。

Freebsd7.0 release 安装 diablo-jdk1.6.0

.最小化安装freebsd.
2.到http://www.freebsdfoundation.org/downloads/java.shtml 下载

Diablo Caffe JDK 1.6.0-7 FreeBSD 7.x/i386 End-User 61M
diablo-jdk-freebsd7.i386.1.6.0.07.02.tbz
3.敲pkg_add diablo* 后发现少了几个东西,xtrans-1.0.4,xproto-7.0.10_1,xextproto-7.0.2,javavmwrapper-2.3.2,需要安装相应的包,在dist1那张盘里面有,javavmwrapper-2.3.2我直接到ftp.freebsd.org上面下。

4.安装完上面那几个后,就可以直接安装了,pkg_add diablo*。中间会有提示,敲YES.
5.设置JAVA环境:
我用的root用户,因此需要修改.cshrc文件。
vi~/.cshrc
在set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
/usr/local/bin $HOME/bin)这一行前面加 上:
setenv JAVA_HOME /usr/local/diablo-jdk1.6.0
setenv CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
然后在set path这一行的那些路径最后面加上jdk的bin路径/usr/local/diablo-jdk1.6.0/bin,就是下面这样:
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin
/usr/local/bin $HOME/bin /usr/local /diablo-jdk1.6.0/bin)

退出再登陆一下就ok了。

6.重新登录后,敲java -version,看看版本信息。

星期二, 十月 14, 2008

PostgreSQL分类汇总方法

我们知道MySQL中有分类汇总函数GROUP_CONCAT来实现将组内相关值的连接,但是在PostgreSQL没有此类的函数,但是我们可以使用以下两种方法来方便的达到我们的目的:

我们首先创建一个测试表,并插入一些测试数据:

create table test(id int,name varchar(100));

insert into test values(1,'aa');
insert into test values(1,'bb');
insert into test values(2,'cc');
insert into test values(3,'dd');
insert into test values(2,'ff');

1.使用数组函数两组内的列表转换成数组

select id,array_to_string(
array(select name from test where id=a.id),',')
from test a
group by id;

--结果

3 | dd
2 | cc,ff
1 | aa,bb

是不是看起来非常的简单呢,呵呵,非常的cool!

2.使用自定义的聚集函数

PostgreSQL除了提供给我们的一些预定义函数之外,还有创建聚集函数的DDL语句,非常的灵活!

--首先创建一个状态传递函数:实现将统计结果传递连接

create function pg_concat( text, text ) returns text as '
begin
if $1 isnull then
return $2;
else
return $1 || $2;
end if;
end;' language 'plpgsql';

--创建一个最终的结果函数:实现将最后一个连接符号清除

create function pg_concat_fin(text) returns text as '
begin
return substr($1,1,length($1)-1);
end;' language 'plpgsql';

--创建聚集函数,入口参数basetype:text,状态传递函数:pg_concat,状态变量类型:text,结果函数finalfunc:pg_concat_fin
create aggregate pg_concat (
basetype = text,
sfunc = pg_concat,
stype = text,
finalfunc = pg_concat_fin);

--使用聚集函数进行统计:

select id,pg_concat(name||',')
from test
group by id;

--结果
3 | dd
2 | cc,ff
1 | aa,bb

和第一种方法得到的结果是一样的,非常的方便。

PostgreSQL的许多小技巧

1.使用空间索引进行快速间隔数据类型的搜索.

间隔搜索有时候很慢,大部分原因是索引优化器不使用索引,并且在开始列和结束列比较独立。一个解决方案是使用空间索引,它可以把两个独立的值当做一个值来使用。

postgres=# EXPLAIN ANALYZE SELECT * FROM testip WHERE 19999999 BETWEEN
startip AND endip;

QUERY PLAN ----------------------------------------------------------------
Seq Scan on testip (cost=0.00..19902.00 rows=200814 width=12) (actual
time=3.457..434.218 rows=1 loops=1) Filter: ((19999999 >= startip) AND
(19999999 <= endip)) Total runtime: 434.299 ms (3 rows) Time: 435,865 ms

结论:根据以上的执行计划,可以知道上边的查询使用的是序列扫描,花费的时间是:435,865
ms

postgres=# CREATE INDEX ggg ON testip USING gist
((box(point(startip,startip),point(endip,endip))) box_ops);

使用如下的查询:
EXPLAIN ANALYZE SELECT * FROM testip WHERE
box(point(startip,startip),point(endip,endip)) @> box(point
(19999999,19999999), point(19999999,19999999));

结论:执行计划使用的是Bitmap Index Scan on ggg,花费的时间是:2,805 ms。可见相比以前的查询,使用空间索引的查询效率大大的提高了。

2.16进制到10进制的转换

我们已经有了系统函数将10进制转换成16进制:to_hex(11) result: b 下边的函数实现将16进制的数转换成10进制。非常的简单:

create or replace function to_dec(text)
returns integer as $$
declare r int;
begin
execute E'select x\''||$1|| E'\'::integer' into r;
return r;
end
$$ language plpgsql;

--测试
select to_dec('ff');

--结果
255

3.ALTER TABLE ALTER COLUMN USING 语法

在PostgreSQl里边,我们不能将varchar类型直接转换到bool,但是我们可以使用Using语法加判断后进行转换。

CREATE TABLE foo(a varchar);

INSERT INTO foo VALUES ('ano');

--更改数据类型,会报错误信息
ALTER TABLE foo ALTER COLUMN a TYPE boolean ;
ERROR: column "a" cannot be cast to type "pg_catalog.bool"

--使用Using语法更改数据类型
ALTER TABLE foo
ALTER COLUMN a TYPE boolean
USING CASE a
WHEN 'ano' THEN true
ELSE false END;

--更改成功
SELECT * FROM foo;

4.Quote_ident 的使用

使用双引号是一种防止SQL注入的方法,quote_ident 可以检查参数,如果参数中包含任何非法的字符,它会在参数两边加上""
非常简单和有效,但是问题是schema.name,因为中间有点分割。问题如下:

select quote_ident('public.foo');

他不能在schema和name两边加上双引号。

我们可以通过使用函数来按点分割上边的对象名称,在每个单独的对象上使用quote_ident来完成我们的目的:

--对数组进行表转换,针对每一列来使用quote_ident
CREATE OR REPLACE FUNCTION quote_array(text[])
RETURNS text AS $$
SELECT array_to_string(array(SELECT quote_ident($1[i])
FROM generate_series(1, array_upper($1,1))
g(i)),
'.')
$$ LANGUAGE SQL IMMUTABLE;

--创建函数按点进行拆分字符串
CREATE OR REPLACE FUNCTION quote_schema_ident(text)
RETURNS text AS $$
SELECT quote_array(string_to_array($1,'.'))
$$ LANGUAGE SQL IMMUTABLE;

--测试
select quote_schema_ident('public.foo tab');


5.我们已经习惯使用PostgreSQL的exception来捕捉错误,但是错误信息一直不知道如何取得,SQLERRM变量可以给我们详细的信息
以下是一个具体的示例:

CREATE OR REPLACE FUNCTION fn_log_error(p_function varchar, p_location int,
p_error varchar)
RETURNS void AS $$
DECLARE
v_sql varchar;
v_return varchar;
v_error varchar;
BEGIN
--连接数据库
PERFORM dblink_connect('connection_name', 'dbname=...');

--拼凑插入的字符串
v_sql := 'INSERT INTO error_log (function_name, location, error_message,
error_time) '
|| 'VALUES (''' || p_function_name || ''', '
|| p_location || ', ''' || p_error || ''', clock_timestamp())';
--远程执行
SELECT INTO v_return *
FROM dblink_exec('connection_name', v_sql, false);

--获取远程的错误信息
SELECT INTO v_error *
FROM dblink_error_message('connection_name');
--如果出现错误则抛出异常
IF position('ERROR' in v_error) > 0 OR position('WARNING' in v_error) > 0
THEN
RAISE EXCEPTION '%', v_error;
END IF;

PERFORM dblink_disconnect('connection_name');
EXCEPTION
WHEN others THEN
--使用SQLERRM 来显示错误信息
PERFORM dblink_disconnect('connection_name');
RAISE EXCEPTION '(%)', SQLERRM;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

SQLERRM是一个非常有用的变量,可以详细记录错误的具体信息,帮助我们分析执行中发现的错误。

6.循环优化技巧

plpgsql对于非SQL操作效率不是特别高。Plpgsql 不喜欢字符或者字符数组的累计操作,当我们也不能用Perl,因此我们只能用SQL

--使用循环,结果会比较慢的函数

CREATE OR REPLACE FUNCTION SlowList(int) -- slow function, usable for N <=
100
RETURNS varchar AS $$
DECLARE s varchar = '';
BEGIN
FOR i IN 1..$1 LOOP
s := '<item>' || i || '</item>'; -- slow is s := s || ..
END LOOP;
RETURN s;
END; $$ LANGUAGE plpgsql IMMUTABLE;

--使用SQL,结果会比较快的函数

CREATE OR REPLACE FUNCTON FastList(int) -- fast function
RETURNS varchar AS $$
BEGIN
RETURN array_to_string(ARRAY(SELECT '<item>' || i || '</item>'
FROM generate_series(1, $1) g(i)),
'');
END; $$ LANGUAGE plpgsql IMMUTABLE;

--结果:在循环100以下的时候差别并不是很大,当循环更多的时候,差距就非常明显,都来试试吧!

7.查询一组之中的头n条记录

我们一般的做法是使用子查询如下:

SELECT * FROM people WHERE id IN (
SELECT id FROM people s
WHERE people.category = s.category
ORDER BY age LIMIT 2)
ORDER BY category, age;

使用连接我们也可以达到同样的效果如下:

SELECT s1.*
FROM people s1
LEFT JOIN
people s2
ON s1.category = s2.category AND s1.age < s2.age
GROUP BY s1.id, s1.category
HAVING COUNT(s2.id) <= 1
ORDER BY s1.category, COUNT(s2.id);

说明:这个SQL语句的含义是找到同一类比自己的age大的记录,最后判断比自己大的记录的个数,如果是0,那么应该排名第一,
如果是1,那么排名第二(HAVING COUNT(s2.id) <= 1)

slony1-1.2.10配置简介

PostgreSQL支持许多复制机制,但是个人觉得slony应该是一个不错的选择,因为slony支持异步,单向,级联的将数据从一个源头复制到多个订阅者手中.

异步的意思是一个订阅者的数据不一定是最新的,订阅者可以离线,而并不影响数据源的复制.而当订阅者再次连线后,它可以接收到所有的数据.当然,如果订阅者离线了很长的时间,那么它所要接收的数据将对网络和数据源产生很大的负担.

单向意味着你只能在数据源对表进行更改,并将结果复制到订阅者,而不能在订阅者来对表进行更改.

级连意味着一个订阅者也可以作为数据的源头来进行数据的发布,从而分担了主数据源的负担.

下边我们就开始配置slony, 我是在FreeBSD下配置的,并且已经分别在两台机器上安装好了PostgreSQL 8.2.4和slonyI-1.2.10,注意这里的版本是非常重要的,因为我在以前装
slony1-1.2.9来进行配置的时候会报版本错误.所以还是推荐大家使用最新的版本.

在配置之前我们还需要把设置两台PostgreSQL的配置文件pg_hba.conf ,添加如下可以让对方使用用户,密码的访问方式.

host all all 10.218.143.17/32 password

host all all 10.218.143.35/32 password

下边我们就开始配置slony,配置slony的过程就是通过slonik来输入配置的命令,我们把slonik的配置命令都写成脚本的形式来执行,方便复用.

第一个脚本:preamble.sk

define CLUSTER test;
define dc35 1;
define dc17 2;
define fqn fully qualified name;
define SUCCESS 0;
define FAILURES 1;

cluster name = @CLUSTER;
node @dc35 admin conninfo = 'dbname=portal host=10.218.143.35 user=pgsql
password=pgsql';
node @dc17 admin conninfo = 'dbname=portal host=10.218.143.17 user=pgsql
password=pgsql';

脚本很简单,就是定义一些常量,集群的名称和节点的信息.注意以后的脚本都要包含这个脚本来引用这些常量.

第二个脚本:initCluster.sk

#!/usr/local/bin/slonik

include <preamble.sk>;

#初始话集群和主节点

init cluster (id=@dc35,comment='primary node');

#保存节点信息

store node
(
id = @dc17,
comment = 'secondary node - dc17'
);

#配置连接信息,就是告诉订阅服务器如何来访问数据源的服务器

store path
(
server = @dc35,
client = @dc17,
conninfo ='dbname=portal host=10.218.143.35 user=pgsql
password=pgsql'
);

store path
(
server = @dc17,
client = @dc35,
conninfo ='dbname=portal host=10.218.143.17 user=pgsql
password=pgsql'
);

第三个文件:buildSet.sk

#!/usr/local/bin/slonik

include<preamble.sk>;

#创建复制集,复制集是slony最小的复制单位.

create set (id=1,origin=@dc35,comment='dc35');

#向复制集中添加表

set add table (set id=1,origin=@dc35,id=1,fully qualified
name='public.f_slony');

第四个文件:subscribeSet.sk

#!/usr/local/bin/slonik

include<preamble.sk>;

#创建订阅,设置数据源和数据目标.

subscribe set (id=1,provider=@dc35,receiver=@dc17,forward=yes);

执行完以上4个文件后,slony的整体结构我们基本上已经配置好了.接下来就要启动slon进程来开始复制的工作了,首先我们要写一个配置文件,让slon进行来连接哪个数据库.

文件:dc17.slon

cluster_name='test'
conn_info='dbname=portal host=10.218.143.17 user=pgsql password=pgsql'

文件:dc35.slon

cluster_name='test'
conn_info='dbname=portal host=10.210.143.35 user=pgsql password=pgsql'

启动slon进程:

slon -f dc35.slon >dc35.log &

slon -f dc17.slon >dc17.log &

启动之后观察进程的log信息,如果没有什么错误提示,那就基本上配置成功了,接下来我们就可以测试.我的测试表是f_slony,我们可以对f_slony进行删除修改操作,然后观察订阅的结果.默认slon的扫描频率是2s,我们可以设置这个时间间隔.

星期三, 十月 08, 2008

技术两则

1、计算机加入域的时候,提示限制已经满,无法加入的时候,可在域服务器上执行adsiedit.msc(此工具存在于windows安装盘的supporttools中的support tools中。展开DOMAIN NC节点,选择"DC="对象,右键选择
属性,选择ms-DS-MachineAccountQutota进行编辑即可。
2、ISA中RADMIN服务。装了一台代理服务器,配置windows2003 R2 SP2,代理软件为ISA
2006 SP1,服务器上装有软件(radmin ( remote administrator 2.2),可怎么也联不上。于是不停的实验,最后成功(不过联接速度不快)。
主要是元素为TCP 入站 端口为RADMIn的端口号(inbound,outbound)设成一致即可。还一个主要的就是要在辅助要设tcp 出站 端口为radmin 端口。
原因:一般都设前面的,后面不设。当你发起联接的时候,也有数据流出(要不怎么双向?)不知道大家明白没?

星期二, 十月 07, 2008

PostgreSQL 在 FreeBSD 上的大版本升级

唉!升级...升级...升级...这一阵子一直升级,这次轮到 PostgreSQL 大升级。PostgreSQL 不像其它软件,即使是 8.2 升级到 8.3,也必须大改,所以无法直接用 upgrade 工具直接升。即使是 Windows 版本,也必须劳心费力一番。这次我用 FreeBSD 版本的升级做为例子,来说明最简单也是最正确的大改版升级步骤。
首先,请先把原本数据库的数据完全备份下来。如果你是 Windows 的使用者或是 Linux 的使用者,你可以考虑使用 pgAdmin III 的「工具」选单中的「备份」或「备份全域」来做,这样简单很多,但是由于 pgAdmin III 的说明太少,我实在看不懂「备份」对话框中选项的含意,所以干脆不用。最正式的方法是使用在 console 下的工具:pg_dump 和 pg_dumpall。两者的差别在于,前者可以针对某个特定的 database 做备份,而后者一般用来把整个服务器数据做完整的备份。我建议直接使用 pg_dumpall 比较方便和快速。方法如下:
$ pg_dumpall > filename
而 filename 你可以自己取,比如 host_a.20080206.full.dump 之类的。名称中加入日期可以让你更清楚知道这个备份档备份的日期。加入 full 字眼,可以提醒自己,这是完整备份,而非一般维护时所做的连续性部份备份的一份。如果你所管理的 PostgreSQL 有超过一台以上,那么最好连数据库主机名称都注明。
对了,差点忘了一件极重要的事!在 Windows 上,只要你使用 administrators 群组中的任何一位使用者登入,然后从开始菜单→PostgreSQL 8.3→Command Prompt,就可以打开「命令提示字符」,而且可以下达 pg_dumpall 指令;但是,在 FreeBSD,一般安装时,预设 root 是不允许执行 PostgreSQL 的相关指令的,所以请先切换成 pgsql 用户,如果你没更动 pgsql 的密码,那么预设的密码很「随机」,也就是任你怎么猜也都猜不出来,但是你可以先用 su 切成 root,再用 su - pgsql 切换成 pgsql 使用者,不用输入任何密码即可,这时就可以执行上述指令。但是请注意,这时最好把这个备份文件移到安全位置,以免继续进行的安装过程中不傎误砍。所以这时候你最好是先跳回 root,请下 exit 指令,然后用 cp 指令把刚才那个 dump 檔 copy 到任何你暂存的位置。
接着正式执行安装。在安装新版本之前,必须先移除旧版本,否则两个 daemon 会抢同一个 TCP port,开机时会有无法预知的状况出现。首先先看一下你的服务器中,目前装了哪些和 PostgreSQL 相关的 package:
# pkg_info grep postgresql
这时候你至少可以看到两个 package 出现在清单中,而我多了一个:
postgresql-client-8.2.6_1 PostgreSQL database (client)postgresql-contrib-8.2.6 The contrib utilities from the PostgreSQL distributionpostgresql-server-8.2.6 The most advanced open-source database available anywhere
一般来说,如果你没有安装Server instrumentation 功能,那么应该只有 client 和 server 两个 package。但是这个小清单并不完整,如果你还有安装 php 和 PostgreSQL 相关的驱动程序,那么这时候并不会出现在这个清单当中。不用担心,你若移除的顺序不对,出现相依的套件,那么把相依套件移除,再来移除目标套件即可。只是这时候你最好拿只笔记下你一共移除了哪些套件,将来才能再一一重新安装回去。我们先以这三个 package 来说好了,如果你没移除旧版本的 server,那么直接移除 client 会被提醒,而且停止进行安装动作。同样的,如果你没先移除旧版本的 contrib 和 php 相关 package,你在移除 client 时也会因为相依套件尚未被移除,而被停止移除 client 的动作。所以若以上述三者为例,则移除的顺序为:
# /usr/local/etc/rc.d/postgresql stop <-- 先停掉目前的 PostgreSQL server# pkg_delete postgresql-contrib-8.2.6# pkg_delete postgresql-server-8.2.6# pkg_delete postgresql-client-8.2.6_1
这时请把 /usr/local/pgsql/data 整个目录移走,像我只是把它改个名称,而让它继续留着,说不定哪天还会用到目录中的某些档案:mv /usr/local/pgsql/data /usr/local/pgsql/data_8.2。然后就可以开始使用 port 来安装 PostgreSQL 8.3 了。在安装前,请先确定你的服务器上的 port tree 是否已是最新的版本,如果你的 port tree 是在 2008/2/5 天亮前更新的,可能 postgresql-server-8.3 还不是最新版本,请先手动更新 port tree。如果已是最新版本,那么切到该 port 目录:
# cd /usr/ports/databases/postgresql83-server# make install clean
FreeBSD 会自动帮你将 8.3 版的 server 和 client 都一并装好。接着把 contrib package 也装起来:
# cd ../postgresql-contrib# make install clean
如果你曾经把 php5 的 driver 移除掉或 JDBC 等等等之前移除掉的套件,现在也请用同样的方法把所有新的版本一一装回去。这样就好了吗?还早,请先看一下你的 /usr/local/pgsql 下是否已经建好新的数据库?
# ls /usr/local/pgsql
如果这个目录下只出现一个刚才更名的 data_8.2,那么代表 Makefile 并没有自动帮你做 initdb,请执行:
# /usr/local/etc/rc.d/postgresql initdb [1]
这时你再下 ls /usr/local/pgsql 指令时,就可以看到多出一个 data 目录了,这样才能正确启动 PostgreSQL:
# /usr/local/etc/rc.d/postgresql start [2]
如果没出现任何错误讯息,那么先恭喜你,安装好了。但是工作才完成一半,再来是把原来备份的数据回存回数据库中:
# su - pgsql$ psql -f filename postgres
也就是先切成 pgsql 使用者,接着执行 PostgreSQL 的交互式指令输入工具:psql,然后把刚才你的 dump 档的名称(这里当然是完整路径名称)取代上面的 filename。接着一些讯息代表着数据库回存的动作,正在做什么动作。如果一切错误讯息都没有出现过,那么恭喜你,工作完成了 80%。对于 Windows 的使用者来说,只要记住最后一条指令,就可以把刚才 pg_dumpall 所备份的数据回存了。Windows 的使用者真幸福。
什么?才完成 80%?是的,有两个档可能之前的版本你有更动过,分别是 postgresql.conf 和 pg_hba.conf,它们在 FreeBSD 中应该位于 /usr/local/pgsql/data 目录下,请把之前曾经更动过的改回去,但是请把 release notes 先读过一遍,因为 postgresql.conf 中很多管理项目都更动过了,可能之前你所更改的项目,8.3 版已经把该项和其它项目合并,并取了新的项目名称了,先读过 release notes 的 E.1.2.2. Configuration Parameters 是很重要的。还有,刚才如果把旧的 8.2 版的 /usr/local/pgsql/data 目录直接删掉,那此刻就糗了,你必须用你的记忆力回想你曾经更动过的项目和内容,所以我才会建议只需把它更名,保留下来。
若是你对 PostgreSQL 的备份和回存有兴趣,英文程序也还可以,那么请进一步参考 PostgreSQL 的在线说明:Chapter 24. Backup and Restore
附注:[1] 当然啰,如果新的 data 目录已经生成,也就是 Makefile 已经自动帮你执行 initdb 的动作了,那么 initdb 这个动作就可以省了。我会特别这样提的原因是,我现这两天的抢先版本的 Makefile 怪怪的,有时不会自动执行 initdb 动作。 [2] 如果你没有像我这么麻烦的用 pg_dumpall 和 psql 来备份回存,直接升级(还是得先移除旧版本再安装新版本),表面上看起来还是可以升级,但是,事实上 Makefile 会把你旧版本的 postgresql.conf 和 pg_hba.conf 复制一份到新的 data 目录中。如我文中所说的,postgresql.conf 在这个版本中有大更动,因此,当你打算启动数据库时,会出现 FATAL ERROR!解决方法很简单,用不着重灌,把新的 data 目录移走(一样用更名的),执行 /usr/local/etc/postgresql initdb,重做一次 initdb,就会有一个全新版本的 data 了。[3] 这篇文章仅适用于负载不大的服务器上,倘若你的服务器是 mission critical 的大用量服务器,虽然基本的升级概念是一样的,也就是数据库大升级等同重新安装,所以服务势必一定得中断,但是事前的演练和良好的计划,可以让停机服务的时间减少。在这种情况,建议必须得增加备援服务器,在主服务器升级的同时,让备援服务器先暂时服务。说到这里,就得牵涉到「数据库复制」(replication) 的主题了。等我有空再来写一篇 PostgreSQL 和 replication 相关的文章。

FreeBSD 安装 PostgreSQL 的笔记

本文是笔者用来记录 FreeBSD 安装 PostgreSQL 的笔记,文中有提到为了增加 PostgreSQL 的 max_connections 数目,而调整了 FreeBSD 系统的 /etc/sysctl.conf & /boot/loader.conf 两个档案。如果你只是想安装 PostgreSQL 玩玩,而不需要调整 max_connections 数目,你可以忽略修改上述两个档案的内容。
1.修改 FreeBSD 系统参数
修改 /etc/sysctl.conf 增加以下指令kern.ipc.shmmax=134217728kern.ipc.shmall=32768kern.ipc.semmap=256
修改 /boot/loader.conf 增加以下指令kern.ipc.semmni=256kern.ipc.semmns=512kern.ipc.semmnu=256
2.安装 PostgreSQLcd /usr/ports/databases/postgresql83-servermake install
安装 libxml2 模块cd /usr/ports/textproc/libxml2make install
安装 libxslt 模块cd /usr/ports/textproc/libxsltmake install
安装 XML for PostgreSQLcd /usr/ports/databases/postgresql83-server/work/postgresql-8.3.3/contrib/xml2gmake install
安装 adminpackcd /usr/ports/databases/postgresql83-server/work/postgresql-8.3.3/contrib/adminpackgmake install
3.修改 /etc/rc.conf 增加以下指令,以便开机自动执行 PostgreSQL
postgresql_enable=”YES”# optionalpostgresql_data=”/pgdb”postgresql_flags=”-w -s -m fast”postgresql_initdb_flags=”–encoding=utf-8 –lc-collate=C”postgresql_class=”default”
4.初始 PostgreSQL 数据库建立放置 PostgreSQL 数据库档案的目录,同时修改该数据匣权限,改完权限后便初始化 PostgreSQL 数据库
mkdir /pgdb
chown pgsql:pgsql /pgdb
su -l pgsql -c “initdb -D /pgdb -E utf8″
5.修改 /pgdb/postgresql.conf 以便符合实际系统运作需求,这边大家可以斟酌调整listen_addresses = ‘*’ //聆听其它主机联机讯号max_connections = 200 //增加同时联机数量#log_destination = ’syslog’ // 批注log_destination = ’stderr’ // 标准输出 loglog_directory = ‘pg_log’log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’log_rotation_age = 1dlog_rotation_size = 10MBclient_min_messages = noticelog_min_messages = noticelog_error_verbosity = defaultlog_min_error_statement = errorlog_duration = onlog_line_prefix = ‘%u %d %h %i’log_statement = ‘mod’stats_start_collector = onstats_row_level = on
6.修改 /pgdb/pg_hba.conf 以便可以透过网络连接该 PostgreSQL 服务器。# “local” is for Unix domain socket connections onlylocal all all trust# IPv4 local connections:host all all 127.0.0.1/32 trusthost all all 10.3.1.21/32 trusthost all all 10.3.1.22/32 trusthost all all 10.3.1.23/32 trusthost all all 10.1.1.0/32 trusthost all all 10.2.1.0/24 md5# IPv6 local connections:host all all ::1/128 md5host all smart_teacher 10.3.1.0/24 md5host all postgres 10.3.1.0/24 md5host all ischool 10.3.1.0/24 md5
7.启动 PostgreSQL/usr/local/etc/rc.d/postgresql start
8.建立预设使用者su -l pgsql -c “createuser -P”
账号名称:postgres
9.启用其它相关外挂套件
启用 adminpacksu -l pgsql -c “psql -U postgres postgres < /usr/local/share/postgresql/contrib/adminpack.sql”
启用 XML 支援 for PostgreSQLsu -l pgsql -c “psql -U postgres postgres < /usr/local/share/postgresql/contrib/pgxml.sql”
完成以上步骤,基本上你的 PostgreSQL 应该就可以正常运作了。
— 2008/08/13 新增 —
PostgreSQL 安装时修改 Makefile 档案,可以解决 xslt_process 无法安装的问题
找到底下设定
CONFIGURE_ARGS+=–with-libraries=${LOCALBASE}/lib \–with-includes=${LOCALBASE}/include \–enable-thread-safety \–with-docdir=${DOCSDIR} \–with-libxslt \–with-libxml增加红色的部份

ASP.Net2.0连接PostgreSQL数据库

PostgreSQL 是一种非常先进的对象-关系型数据库管理系统(ORDBMS),目前功能最强大,特性最丰富和最先进的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。自从MySQL 被Sun 收购后,相信很多对该收购不放心的朋友会转而看好PostgreSQL 的前途。之前我曾经博客中介绍过Ubuntu中通过源码安装编译安装PostgreSQL。在ASP.Net中使用PostgreSQL数据库作为后端数据存储,连接方法有以下两种:

一、采用商业组件的方式PostgreSQLDirect .NET目前商业组件使用较多的是PostgreSQLDirect .NET,不过这个需要付费,最便宜的标准版网上报价也要1000元人民币。PostgreSQLDirect .NET是一款为Microsoft .NET Framework提供直接PostgreSQL数据库连接的数据发生器控件。它完全基于ADO.NET方法,因此您完全可以采用标准ADO.NET数据提供的方法来使用它。安装之后会在Visual Studio 2005工具栏出现PostgreSQLDirect组件包含了PgSqlConnection PgSqlCommand PgSqlDataAdapter 等控件(如下图),然后在项目里添加引用:CoreLab.Data和CoreLab.PostgreSql,可以拖放控件连接数据库,使用方法2005的和自带控件基本相同。也可以写代码连接数据库,具体代码如下:
PgSqlDataSet ds = new PgSqlDataSet();string sql = "SELECT * FROM test WHERE tid=3000";PgSqlConnection con = new PgSqlConnectio("user id=username;Password=pwd;host=hostname;database=test");PgSqlDataAdapter da = new PgSqlDataAdapter(sql, con);da.Fill(ds);this.dataGridView1.DataSource = ds;this.dataGridView1.DataMember = ds.Tables[0].ToString();

二、使用开源组件Npgsql
Npgsql是一个为开源数据库PostgreSQL提供.NET Framework平台下数据驱动服务的库函数程序集(.NET Data Provider),它允许用户在.NET Framework平台下建立用于访问PostgreSQL数据库的应用。
解压后将其中的两个dll文件复制到应用程序的Bin目录下,
然后在项目里添加引:Mono.Security和NPgSQL,
在代码里添加using NpgSQL;
具体代码如下:
string sql = "SELECT * FROM test WHERE tid=3000";
NpgsqlConnection con = new NpgsqlConnection("server=hostname;uid=username;pwd=pwd;database=test");
NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql,con);
DataSet ds = new DataSet();
da.Fill(ds);
this.dataGridView1.DataSource = ds;
this.dataGridView1.DataMember = ds.Tables[0].ToString();

相关链接:
PostgreSQLDirect .NET官方网站 http://www.crlab.com/pgsqlnet/
Npgsql官方网站 http://pgfoundry.org/projects/npgsql
PostgreSQL官方网站 http://www.postgresql.org/