07 2012 档案
摘要:后台postgresql 数据库 pg_ctl -D /usr/local/pgsql/data start ,保留终端端口前台 pgpool.conf 中 如果 health_check_user 不设置的话,缺省值为 nobody经过一段时间运行后,在后台数据库的终端端口中会出现:FATAL: role "nobody" does not exist这个信息随着health_check,不断地在后台出现。甚至最严重的时候,会导致pgpool认为 后端数据库没有响应。设置 health_check_user 为 postgres后,错误就不出现了。
阅读全文
摘要:继续对pgpool-II的child.c里面的 do_child函数进行分析,改动代码如下:/* * child main loop */ void do_child(int unix_fd, int inet_fd) { ...
阅读全文
摘要:如果debug 状态下运行 pgpool-II, 会发现它生成了很多的子进程。这些子进程是如何生成和利用的?看源代码中的作法:pgpool.conf 配置文件中有如下选项:num_init_children在main.c程序中,有如下的代码部分(去掉了一部分无关代码):/* * pgpool main program */ int main(int argc, char **argv) { …… ...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gmail.com]用这个从网上找的例子,看父子进程对全局变量的拥有是否不同:#include #include #include int glob = 6; char buf[] = "a write to stdout\n"; int main() { int var; pid_t pid; var = 8...
阅读全文
摘要:还是从官方的文档上来:http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-en.html从Online Recovery 的OverviewConfiguration for online recoveryInstalling C language functionsRecovery script deploymentHow to perform online recovery几段里可以看到其设定和执行方法。也就是说:要在设定好各种参数和脚本的前提下,通过手工执行命令pcp_recovery_node 命令,来进行数据库级别的
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页在health_check_period 有效的情况下,当 pgpool-II 所连接的节点如果有了故障,会引发如下几件事:1 在main.c的主循环中标记出故障的节点不可用(log中会看到:类似set 1 th backend down status),2 然后调用 failover()函数,切断所有的连接(kill 所有process:log中会看到:Restart all children);3 再然后,重新开始对尚且有效的各节点进行连接(重新创建一堆.
阅读全文
摘要:pgpool-II中,与health check 相干的配置文件项有两个:health_check_periodhealth_check_timeout乍一看他们 文档的解释,看官方网站的说法:http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-en.htmlhealth_check_periodThis parameter specifies the interval between the health checks in seconds. Default is 0, which means health check is
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gmail.com]pgpool与 pgpool-II 是两种东西,网上和实际工作中,大家常把两者混淆。而且,百分之九十是指的 pgpoo-II。在其网站上下载的时候,一定得注意:即便你点击了http://pgfoundry.org/projects/pgpool里面的 pgpool-II那一行的download, 一不小心,还是会着了道:我点击后进入http://pgfoundry.org/frs/?grou.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gmail.com]pgpool这个东西,其实我并不看好。但是这个算穷人的复制/主从解决方案。既然有客户用,就得研究研究。这里我目前所指,是 PPAS(PostgresPlus Advanced Server)里打包好的 pgpool,各个DB节点也是运行 PPAS。关于PPAS这个东西,仁者见仁,智者见智;等以后有了时间再说它。在pgpool运行的节点上,安装PPAS的时候,把组件里的pgpool也给选上就好.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页[作者:高健@博客园 luckyjackgao@gmail.com]接前文 ListenSocket,进一步进行研究:pqcomm.c 中的StreamServerPort函数中,增加如下代码:int StreamServerPort(int family, char *hostName, unsigned short portNumber, char *un...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页[作者:高健@博客园 luckyjackgao@gmail.com]对postmaster.c 中的 readmask,rmask,nsocket等进行分析,可以看到:它们之间有如下的关系(与细节无关的代码省略):/* * Initialise the masks for select() for the ports we are listening on. * Return the...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页[作者:高健@博客园 luckyjackgao@gmail.com]接着 ListenSocket的研究(二) 一文,进一步进行分析,改动postmaster.c的ServerLoop函数代码如下:if (selres > 0) { int i; ...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页[作者:高健@博客园 luckyjackgao@gmail.com]在对 PostmasterMain加入代码的基础上:/* * Postmaster main entry point */ ...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页[作者:高健@博客园 luckyjackgao@gmail.com]为了对 postmaster.c 中的 ListenSocket 进行研究,先将其代码做一个概括(大部分代码省略):/* * Postmaster main entry point */ ...
阅读全文
摘要:PostgreSQL的postmaster.c 中,PostmasterMain函数中,和ListenSocket数组相关的代码大致如下/* * Postmaster main entry point */ int PostmasterMain(int...
阅读全文
摘要:postmaster.c 中,主循环的大致流程如下:/* * Main idle loop of postmaster */ static int ServerLoop(void) { ...
阅读全文
摘要:可以说,postmaster是PostgreSQL服务器端的总代理了。通过它,把客户端的请求转给新生成的postgres 进程。postmaster.c 的代码注释中有如下的描述:When a request message is received, we now fork() immediately.The child process performs authentication of the request, and then becomes a backend if successful.This allows the auth code to be written in a s...
阅读全文
摘要:postmaster.c 中的BackendStartup(Port *port)函数,其中有如下代码:/* in parent, successful fork */ ereport(DEBUG2, (errmsg_internal("forked new backend, pid=%d socket=%d", (int) pid, port->sock))); 为了方便调试,改为:/* ...
阅读全文
摘要:在PostgreSQL的源代码 postmaster.c 的BackendStartup 函数中,有如下的部分(中间部分省略):#ifdef EXEC_BACKEND pid = backend_forkexec(port); #else /* !EXEC_BACKEND */ pid = fork_process(); .... #en...
阅读全文
摘要:PostgreSQL的configure 脚本中有如下代码:if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@&
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者:高健@博客园 luckyjackgao@gmail.com] PostgreSQL中,configure中第一段是如下的代码: if test
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页作者:高健@博客园 luckyjackgao@gmail.comPostgreSQL的configure 脚本中有:if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@&
阅读全文
摘要:由于对Linux 下的configure不很了解,所以进行了一番学习。网上的这篇文非常不错:http://tech.sina.com.cn/s/2004-10-19/1115443045.shtml而且,其中提到了这样一句话:"大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。"autoconf读取configure.in 的内容,生成脚本名正是 configure。今后将进一步的查看 PostgreSQL的 configure的内容
阅读全文
摘要:在编译postgresql 源码的时候,postgresql 的configure 干了些什么呢?应该是对系统进行了一系列的探测,比如OS种类之类。具体来说,这些探测的结果,表现在,运行后,生成下列的文件(以postgresql9.0.2为例):./postgresql-9.0.2/config.log./postgresql-9.0.2/config.status./postgresql-9.0.2/GNUmakefile./postgresql-9.0.2/src/backend/port/dynloader.c./postgresql-9.0.2/src/backend/port/pg_
阅读全文
摘要:在 postmaster.c 中看到这种代码,从Java程序员的角度,看起来是很不爽的:char *ListenAddresses;... if (ListenAddresses) { char *rawstring; List *elemlist; ListCell *l; ...到底何时 ListenAddress 的逻辑值为真呢?试作如下代码进行验证:char *ListenAddresses;intmai...
阅读全文
摘要:为了验证对数据缓冲区 PqSendBuffer写入数据未满时,也要进行flush。对代码进行如下修改:pqcomm.c 的internal_putbytes 函数:头部加入:fprintf(stderr,"len is: %d",len); fprintf(stderr," , PqSendPointer is: %d\n", PqSendPointer);pqcomm.c 的pq_flush 函数:头部加入:fprintf(stderr," pq_flush is called\n.");重新编译后,启动Postgresql(非后台
阅读全文
摘要:message level 函数pq_putmessage调用 low level 函数 pq_putbytes,pq_putbytes调用 internal_putbytes。从internal_putbyes上来看,就可以发现其数据发送的机制:有一个小技巧,如果数据缓冲区满了,就发送,否则就先堆在那儿。如果原有数据+本次数据量大于数据缓冲去大小那就分多次循环发送。internal_putbytes(const char *s, size_t len) { size_t amount; while (len > 0) { /* I...
阅读全文
摘要:async.c的 static void NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid) 函数中的主要逻辑是这样的:if (whereToSendOutput == DestRemote) { StringInfoData buf; pq_beginmessage(&buf, 'A'); //cursor 为 A pq_sendint(&buf, srcPid, sizeof(int32)); //追加 srcPid pq_sends...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页接PostgreSQL的notify 与listen (六)的内容,探讨一下谁真正接受notify 消息。修改PostgreSQL的源代码:src/backend/command/async.c:NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid)函数if (whereToSendOutput == DestRemote){ StringInfoData ...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页开两个终端执行psql,进行notify 与 listen动作的实验,当时我有一个疑问:从listen 端看到的PID ,到底是谁的ID?验证如下:启动 postgres, 执行 ps -ef|grep postgres看到除了系统级别的postgres外,并没有其他的。postgres -D /usr/local/data (进程号为19651/父进程号为1)postgres:writer processpostgres:wal writer pro.
阅读全文
摘要:src/test/examples/testlibpq2.c 中,有如下一段代码:sock = PQsocket(conn); FD_ZERO(&input_mask); FD_SET(sock, &input_mask); if (select(sock + 1, &input_ma...
阅读全文
摘要:程序逻辑大致如下: /* Make a connection to the database */ conn = PQconnectdb(conninfo); /* Check to see that the backend connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn));...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页利用PostgreSQL的notify /listen 机制,可以实现在psql客户端看到通知消息。但是,如果是Java 应用程序,将会是怎样的?按照PostgreSQL的官方文档,是这样说的:http://jdbc.postgresql.org/documentation/91/listennotify.htmlA key limitation of theJDBCdriver is that it cannot receive asynchrono.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页将 trigger 和 notify 结合起来,可以使客户端在 服务器端数据库表发生变化时,得到通知。从而实现 观察者模式:创建一个用于触发器的函数postgres#create function raise_evt() returns trigger as $$postgres$#beginpostgres$# notify gao;postgres$# return NEW;postgres$#end; $$postgres-#langua...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页事实上,准确地说,notify命令的格式是:NOTIFY channel [ , payload ]首先是信息通道,然后才是 具体信息流。验证如下:session Apostgres#listen channel;session Bpostgres#notify channel '1';postgres#notify channel '2';回到session A随便执行一个命令:postgres#select curre
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页接上文:PostgreSQL的notify 与listen (一)PostgreSQL的notify 与 listen, 有如下的描述信息:http://www.postgresql.org/docs/9.0/static/sql-notify.html......Secondly, if a listening session receives a notification signal while it is within a transactio.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页PostgreSQL提供了 client端和其他client端/服务器端通信的机制。例如开启一个psql (这里称为终端1), 执行:postgres#listen gao; -----------listen后面的消息名是任意的。开启另一psql (这里称为终端2),执行:postgres#notify gao; -----------notify 后面的消息要和 listen的消息名字一致此时,在终端1是其实是没有反应的,要随便再敲一条命令再看...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页PostgreSQL的 源代码中带了一个 目录:src/test/examples/其中都是 用C 语言调用 libpq的例子程序。此目录下也有 Makefile,其中设定都已经作好,例如已经包含:...override CPPFLAGS:=-I$(libpq_srcdir) $(CPPFLAGS)override LDLIBS:=$(libpq_pgport) $(LDLIBS)...我可以拷贝修改:cp testlibpq.c gaolibpq..
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页在PostgreSQL的 Makefile中,有如下的部分:override CPPFLAGS:=…对 override 查询的结果是:在GNU make的范畴里,有如下几种定义变量的地方:1 在make/gmake 的 命令行 加 开关参数。2 在 Makefile或其include的文件中。3 在环境变量中。如果在1/2/3几个地方都出现了同样的变量,那么正常情况下 1 优先,那么如果想要2优先,则在Makefile中使用 override指令。如果想要 3 优先,.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页例子如下:http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/-----------------------------------------------------CC=gccCFLAGS=-I. DEPS = hellomake.h %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) hellomake: hellomake.o hellofunc.o..
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页如题:In particular, the macro CC is the C compiler to use, and CFLAGS is the list of flags to pass to the compilation command.验证如下,Makefile原有内容CC=gcc CFLAGS=-I. hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hell...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页我在学Makefile的写法时候,参考了如下的链接:http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/hellomake.c---------------------------------#include int main() { // call a function in another file myPrintHelloMake(); return(0); }---------...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页经过一番验证,对 libpq 的编译过程有了进一步的了解。src/interfaces/libpq 目录下,有很多的 c 源文件。如:fe-misc.c ,fe-print.c 等等。那么这些文件和最终编译好的libpq.so 有何关系呢?从源文件目录下的几个文件来看:src/interfaces/libpq/Makefile中,有:... OBJS=.... fe-misc.o ...src/interfaces/libpq/nls.mk中,有:..
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gmail.com]今天查阅 gcc 的man page, 看到一个 gcc -O2 的解释。可以看到 -O1 -O2 -O3 都是 编译器的优化功能。其中那个 -O2的解释:The compiler does not perform loop unrolling...对何为 loop unrolling不很理解,就 google了一下:http://www.devx.com/tips/Tip/12978也就是,编译器把某.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页再接再励,接这前面的短文 如何使 Postgresql 的psql 使用 中文提示信息来看看如何修改PostgreSQL显示的信息内容:以psql为例:src/bin/psql/po目录下,有zh_CN.po文件,修改其中的内容:msgid "Enter new password:"msgstr "输入新的密码:" msgid "Enter it again:" msgstr "再次输
阅读全文
摘要:在CentOS中,如何安装中文输入法?可以采用简单的办法:yum groupinstall chinese此后,再查看中文相关的信息:yum search chinese显示信息如下:...scim-pinyi.i386 SCIM的智能拼音输入法引擎...如果想要呼出拼音输入法,可以按 ctrl+空格
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@gmail.com]和很多的开源软件一样,Postgresql 中使用 GNU 的 gettext 机制来完成多语言变换。它在自己的src各子目录下准备了很多的po文件,比如 src/bin/psql 目录下的:zh_CN.po , jp.po, fr.po 等。按理说,configure 时,加入 –enable-nls=zh_CN 就可以了。但是执行了很多次都没有成功。由于一个偶然的因素,才发现了其中.
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页Postgresql 中,Table的生成者自动成为 此Table的所有者。但是也可以转移所有者权。不过这要分成两种情况:如果是数据库超级用户,比如用户postgre,可以直接转: alter table testtab owner to gao;如果不是数据库超级用户,比如普通用户 gao 把Table testtab的所有权转给 普通用户 jian: 直接转是会失败的(尽管你是所有者): alter table testtab owner...
阅读全文
摘要:磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页有时候,使用者会遇到 access to schema … denied 之类的出错信息。Postgresql 里面,对数据访问的权限,至少分为两个层次。一个是 schema, 一个是 table。所以,对一个普通用户test而言,如果由超级用户给他权限:Grant all on schema01. Table01 to public;而此时再以普通用户test 来登陆,Test=> select count(*) from schema01.Ta
阅读全文