﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Read Sean-随笔分类-Database</title><link>http://www.blogjava.net/sean/category/18649.html</link><description>Read me, read Sean.</description><language>zh-cn</language><lastBuildDate>Mon, 24 Mar 2008 01:19:53 GMT</lastBuildDate><pubDate>Mon, 24 Mar 2008 01:19:53 GMT</pubDate><ttl>60</ttl><item><title>[Tips] 移植Oracle数据库到PostgreSQL的要点</title><link>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 11 Mar 2008 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/185510.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/185510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/185510.html</trackback:ping><description><![CDATA[
		<br />最近尝试把一个Oracle数据库，连同构建在这个数据库上的Java应用移植到PostgreSQL环境。在移植过程中，总结了一些要点，一方面作为笔记备忘，一方面也给有类似任务需要处理而又无从下手的朋友作为参考。<br /><br />1- 首先是准备PostgreSQL环境。有条件的话，最好是找一台空闲的PC机作为测试服务器，安装Linux或BSD，然后从源码编译最新的PostgreSQL 8.3.0。编译时，通过configure指定--with-perl和--with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和Python，不必额外安装。<br /><br />2- 如果是Windows环境，又需要Perl和Python，则必须额外安装，Python的话，可以方便的找到2.5 for Windows的安装包，Perl的话，推荐ActivePerl，相对麻烦一点，为了后面用到的一些便利的功能顺利加载，Perl版本尽量选5.8.8。<br /><br />3- 创建数据库和用户。通过initdb初始化数据目录，配置postgresql.conf指定主机IP、端口等等信息，配置pg_hba.conf指定访问权限，通过pg_ctl -D &lt;数据目录&gt; -l &lt;日志文件&gt; start启动postmaster，然后createdb、createuser创建数据库和用户。数据库建好之后，就可以createlang -d &lt;数据库名&gt; [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看。<br /><br />4- 安装PostgreSQL客户端pgAdminIII，最新版是1.8.2，有条件的话，也可以下载源码自己编译。<br /><br />5- 安装Oracle客户端，需要在PostgreSQL同一台机器，以便Perl用于连接数据库的DBI和Oracle驱动DBD::Oracle模块顺利安装。如果是Windows上的ActivePerl，则可以通过ppm install DBD-Oracle，如果是Linux/BSD，则可以通过CPAN来安装，如perl -MCPAN -e shell进入CPAN Shell，通过install &lt;模块名&gt;或force install &lt;模块名&gt;安装DBI和DBD::Oracle。<br /><br />6- 数据库的移植，可以选择ora2pg来帮忙，目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据，并生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很简单，就是通过.conf文件指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data等等，然后执行一个pl脚本。这是目前相对比较成熟的一个方案，但是遇到schema复杂、约束较强的数据库，需要手工处理的地方还是不少。建议不要直接写入PostgreSQL，而是生成SQL脚本，验证无误后再执行。ora2pg默认会把Oracle中名称的大写转换成小写，因为PostgreSQL在解析SQL时，除非""括起来，默认都是转成小写。schema、table、view、sequence、data等等，基本用ora2pg，加上一些手工调整即可搞定。至于function、stored procedure等，还是手工移吧，偷不得懒。除了ora2pg，其实也可以配置DBI-Link，将Oracle数据库挂到PostgreSQL数据库作为一组独立的"schema"，然后用create table xxx as select ... from ...这样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblink，不过是连接其他PostgreSQL数据库的，如果需要连接非PostgreSQL，
还是考虑DBI-Link，任何可以通过Perl的DBI接口访问的数据库，都能link进PostgreSQL。<br /><br />7- 接下来就是Java应用本身了，我这次移的这个应用是Spring+iBatis架构的，很多SQL语句都是明文，好在DAO层的基础部分(CRUD)的SQLMap是工具自动生成，且都是符合ANSI SQL92标准的，不需要修改即可使用。其余的高级查询SQL，需要调整的地方不少，一些常见的修改列举如下：<br /><br />i. SELECT出来的column（包括子查询），如果有别名，必须加AS，比如 select null as some_column from some_table;<br />ii. PostgreSQL没有dual表，类似select 0 from dual的语句，写成select 0即可;<br />iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;<br />iv. NVL()函数，PostgreSQL中相对应的是coalesce()，其实几乎所有主流DBMS都支持coalesce，包括Oracle，这才是标准写法;<br />v. 比较日期，在PostgreSQL中，建议使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)这样的写法，其中'day'位置可选字段包括有year、month、week、hour、minute、second等等;<br />vi. SYSDATE，对应到PostgreSQL是current_timestamp，可以根据需要使用current_date;<br />vii. ROWNUM，通常我们用ROWNUM都是为了限制查询出来的记录数，PostgreSQL没有这个关键字，需要改成在SELECT语句最后添加 LIMIT语句，如LIMIT 100;<br />viii. (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);<br />ix. CONNECT BY ... START WITH ... 递归查询可以参考 http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.<br /><br />最后再多提一点，PostgreSQL自带的过程语言是PL/pgSQL，在PostgreSQL上写function，除了用plpqsql，还支持sql、plperl(u)、plpython(u)等等。如果你对SQL天生过敏，看类似PL/pgSQL的代码都很吃力，别说是写了，你完全可以用你喜欢的语言来表达函数和存储过程的逻辑。有了PL/Python，你还怕什么呢？你几乎能做任何事。<br /><br />[更新 20080313] 把JDBC驱动的部分漏掉了，移植Java应用时，除了改SQL，还需要拿PostgreSQL的JDBC驱动放到classpath下面，如WEB-INF/lib，然后修改数据库连接URL，改成jdbc:postgresql://&lt;ip&gt;:&lt;port&gt;/&lt;dbname&gt;即可。<br /><br />[更新 20080323] 移植schema和数据时，比ora2pg更方便的一种方式是利用EnterpriseDB的Migration Tool，将Oracle的JDBC驱动ojdbc14.jar拷贝到EnterpriseDB安装路径下的jre/lib/ext下后，启动Developer Studio即可建立Oracle连接，选中schema后，可以通过右键Online Migration将schema、数据、函数包等等一次性通通导入EnterpriseDB。如果要继续往"纯"PostgreSQL移，从EDB做backup，然后到PostgreSQL下做restore，这样会丢掉函数包，因为毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容，不过函数包之类还是手工移比较稳妥。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/185510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-03-11 23:04 <a href="http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] 开源数据库PostgreSQL正式发布8.3版</title><link>http://www.blogjava.net/sean/archive/2008/02/07/179424.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 07 Feb 2008 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/07/179424.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/179424.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/07/179424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/179424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/179424.html</trackback:ping><description><![CDATA[
		<br />经过1月3日和1月18日两轮RC后，PostgreSQL 8.3终于在本月初正式发布了。该版本有很多功能和性能上的重大提升，包括全文搜索、新的数据类型(XML、ENUM、UUID等)、并发autovacuum、异步提交等等，以及对Windows平台更好的支持，如SSPI和VC++等。<br /><br />官方声明: <a target="_blank" title="http://www.postgresql.org/about/news.918" href="http://www.postgresql.org/about/news.918">http://www.postgresql.org/about/news.918</a><br />Release Notes: <a target="_blank" title="http://www.postgresql.org/docs/8.3/static/release-8-3.html" href="http://www.postgresql.org/docs/8.3/static/release-8-3.html">http://www.postgresql.org/docs/8.3/static/release-8-3.html</a><br />各版本功能对照: <a target="_blank" title="http://www.postgresql.org/about/featurematrix" href="http://www.postgresql.org/about/featurematrix">http://www.postgresql.org/about/featurematrix</a><br />下载: <a target="_blank" title="http://www.postgresql.org/ftp/" href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/179424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-07 10:04 <a href="http://www.blogjava.net/sean/archive/2008/02/07/179424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 11g今年8月登陆Linux</title><link>http://www.blogjava.net/sean/archive/2007/07/14/130252.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 14 Jul 2007 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/07/14/130252.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/130252.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/07/14/130252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/130252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/130252.html</trackback:ping><description><![CDATA[
		<br />
来自PC World的报道:<br /><a href="http://www.pcworld.com/article/id,134381-c,databases/article.html" target="_blank">http://www.pcworld.com/article/id,134381-c,databases/article.html</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/130252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-07-14 12:31 <a href="http://www.blogjava.net/sean/archive/2007/07/14/130252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 解决Linux环境下SQL*Plus方向键无法使用的问题</title><link>http://www.blogjava.net/sean/archive/2007/06/07/122736.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 07 Jun 2007 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/06/07/122736.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/122736.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/06/07/122736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/122736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/122736.html</trackback:ping><description><![CDATA[
		<br />
Linux下面使用Oracle的SQL*Plus工具有个挺恼人的问题：通过sqlplus命令进入到SQL*Plus控制台后，我们在Bash中已经
习以为常的上下左右键突然变成了^[[A^[[B^[[D^[[C这样的"乱码"。熟悉ksh的朋友肯定要说我们这是大惊小怪了，不过对于从
Windows平台转过来的一般用户而言，不小心按错一下就是4个错误的字符，而且历史命令也无法方便的回查了，确实挺郁闷的。<br /><br />
别着急，如果你的Linux是Debian或者Ubuntu/Kubuntu，直接sudo apt-get install
rlwrap安装这个小巧的readline扩展，然后就可以以rlwrap
sqlplus的方式进入方向键"正常"的SQL*Plus了。当然，如果嫌每次敲rlwrap不爽，可以在/etc/profile或者自己的
~/.bashrc里面添加alias sqlplus='rlwrap sqlplus'。其他发行版的朋友可以选择rpm包或者干脆从源码自己编译。<br /><br /><img src ="http://www.blogjava.net/sean/aggbug/122736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-06-07 22:13 <a href="http://www.blogjava.net/sean/archive/2007/06/07/122736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Debian Sarge(3.1r4)下编译和安装PostgreSQL 8.2.1</title><link>http://www.blogjava.net/sean/archive/2007/01/10/92796.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 09 Jan 2007 17:35:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/10/92796.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/92796.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/10/92796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/92796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/92796.html</trackback:ping><description><![CDATA[<br/>
[注]由于Debian相当保守的包管理和更新机制，本文提到的编译和安装过程可能要求你在/etc/apt/sources.list中开放testing级别的包。<br/>
<br/>
1- 首先是去PostgreSQL的官方网站[<a href="http://www.postgresql.org/" target="_blank">link</a>]下载最新8.2.1版本的源码，postgresql-8.2.1.tar.gz。<br/>
2- 拷贝并解压:<br/>
&nbsp;&nbsp;&nbsp;&nbsp; $ sudo -s<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # cp postgresql-8.2.1.tar.gz /opt<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # cd /opt<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # tar zxvf postgresql-8.2.1.tar.gz<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # cd postgresql-8.2.1<br/>
3- 在开始configure和make之前，先做一些准备工作，为了正常configure和make，需要:<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # apt-get install build-essential gcc-4.0 libreadline5 libreadline5-dev m4 flex bison zlib1g zlib1g-dev<br/>
4- 一切就绪，开工: <br/>
&nbsp;&nbsp;&nbsp;&nbsp; # ./configure --prefix=/opt/postgresql  ### 更多选项参考./configure --help ###<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # make<br/>
&nbsp;&nbsp;正常的话，可以看到最后一行输出为: "All of PostgreSQL successfully made. Ready to install."<br/>
5- 安装: <br/>
&nbsp;&nbsp;&nbsp;&nbsp; # make install<br/>
&nbsp;&nbsp;最后应该看到输出"PostgreSQL installation complete."。<br/>
6- 初始化数据库环境: <br/>
&nbsp;&nbsp;&nbsp;&nbsp; # mkdir /opt/postgresql/data<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # adduser postgres<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # chown postgres /opt/postgresql/data<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # sudo -u postgres /opt/postgresql/bin/initdb /opt/postgresql/data/<br/>
&nbsp;&nbsp;编辑/opt/postgresql/data目录下的pg_hba.conf，添加local all postgres ident sameuser和local all all md5两行；<br/>
&nbsp;&nbsp;编辑/opt/postgresql/data目录下的postgresql.conf，去掉listen_addresses的注释符，修改为listen_addresses = '*'。<br/>
7- 启动数据库: <br/>
&nbsp;&nbsp;&nbsp;&nbsp; # sudo -u postgres /opt/postgresql/bin/pg_ctl -D /opt/postgresql/data -l /opt/postgresql/data/serverlog start<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # sudo -u postgres /opt/postgresql/bin/createuser -P dbuser<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # sudo -u postgres /opt/postgresql/bin/createdb testdb<br/>
&nbsp;&nbsp;&nbsp;&nbsp; # /opt/postgresql/bin/psql -U dbuser testdb<br/>
&nbsp;&nbsp;若能正常进入PostgreSQL控制台并执行查询如select version();即表示安装成功。<br/>
<br/>
每次都这样去命令行启动数据库当然有点太笨了，下次再抽空和大家分享PostgreSQL自动化启动脚本的编写。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/92796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-10 01:35 <a href="http://www.blogjava.net/sean/archive/2007/01/10/92796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Ubuntu下安装和配置PostgreSQL 8.1</title><link>http://www.blogjava.net/sean/archive/2007/01/04/91845.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 04 Jan 2007 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/04/91845.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/91845.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/04/91845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/91845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/91845.html</trackback:ping><description><![CDATA[<br/>
在Ubuntu下安装和配置PostgreSQL相对来说很简单，只是需要注意一些细节上的问题。在这里简单过一遍安装步骤，其中带[*]的地方需要特别留意。<br/>
<br/>
1- $ sudo apt-get install postgresql-8.1 #[*]apt-get install postgresql会安装7.4版的PostgreSQL。<br/>
2- $ sudo nano /etc/postgresql/8.1/main/postgresql.conf #如果不是单机使用，需要修改CONNECTION AND AUTHENTICATION段的"#listen_addresses = 'localhost'"为"listen_addresses = '*'"(去掉注释符"#"，允许网络访问而非仅限localhost)。<br/>
3- $ sudo -u postgres createuser -P #依次输入需要创建的用户名、密码、以及是否是超级用户、是否有权限创建数据库、是否有权限添加新的用户/角色 [*] 建议一定要用-P选项当场创建密码，避免以后的连接配置问题。<br/>
4- $ sudo -u postgres createdb [databasename] #创建数据库。<br/>
5- $ psql -U [username] [databasename] #正常的话已经可以进入PostgreSQL交互命令界面，并且看到PostgreSQL版本号，如8.1.4。[*]注意大小写<br/>
6- 安装自己喜欢的客户端，官方推荐pgadminIII，安装方法 $ apt-get install pgadmin3; 或者其他客户端，如Eclipse + QuantumDB (需要另外下载JDBC驱动)。<br/>
<br/>
大功告成，坐下来喝杯咖啡~~<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/91845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-04 21:39 <a href="http://www.blogjava.net/sean/archive/2007/01/04/91845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 跨平台备份/恢复DB2数据库</title><link>http://www.blogjava.net/sean/archive/2006/12/23/89612.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 22 Dec 2006 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/12/23/89612.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/89612.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/12/23/89612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/89612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/89612.html</trackback:ping><description><![CDATA[
		<br />如果你需要在不同的操作系统之间备份/恢复DB2数据库，那么你很可能遇到麻烦，据说有人成功的把DB2数据库在AIX 5上backup然后在Windows下restore，反正我是没那么幸运了，restore过程中除了备份文件名和路径不一致的问题，到最后一步还是报错，而Windows本地数据库backup然后restore就很顺利。<br /><br />世界末日？还好，IBM DB2提供了db2move这个命令行工具，使用方法如下：<br />在需要备份的数据库服务器上执行<br />$&gt; db2move [数据库名称] export<br />根据表的多少，当前目录下会生成一大堆文件，拷贝到新的系统下面，新建一个同名数据库，执行<br />$&gt; db2move [数据库名称] import<br />即可。<br /><br />直接敲<br />$&gt; db2move<br />可以看到命令行选项的说明。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/89612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-12-23 00:04 <a href="http://www.blogjava.net/sean/archive/2006/12/23/89612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>