Postgresql 数据库维护常见问题
一.Postgresql 的小常识
1)Postgresql 数据库在WINDOWS环境下是以一个进程一个连接的方式来处理连接的。
2)Postgresql 数据库判断相应的数据库程序是否启动是通过数据库的数据目录中是否存在postgresql.pid文件作为条件,如果存在则认为该数据库程序已经启动,当然也因为这样个设计导致不少问题(可能在LINUX下面没有啥问题)。
3)每次创建一个Postgresqll数据库的时候,如果不指定区域(比如:中国,美国等),会默认的把当前区域信息作为数据库的区域信息。
二.数据库启动失败的原因
1.日志信息其中有一段日志内容为:无法创建继承的套接字,错误代码 10022 。之后去检测了是否有程序占用了端口(默认的5432),未找到任何程序占用该端口,也没有发现什么特别的异常,百思不得其解。之后把机器上的360安全卫士包括保险箱都卸载后再次启动数据库成功。
2.提示和上一个错误同样的日志信息,机器上没有任何的杀毒软件,无奈中想起了是否系统中有错误,用金山清理专家的LSP查看工具查看后的确提示有异常信息,之后恢复到初始状态,再次启动数据库后成功。同事的机器上安装有深信服的VPN程序,后来终于找到了源头,的确是因为该程序修改了LSP。
3.日志信息为:没有权限访问...目录。因为当前的数据库启动用户不存在WINDOWS用户信息中,或者有该用户信息但是的确该用户的权限不足来访问该数据库目录等。解决的办法,创建一个postgres用户(WINDOWS用户),并且分配足够的权限来启动数据库;或者使用服务的方式来启动数据库,这样数据库就以SYSTEM的权限启动,对基本的目录都有足够的访问权限。
4.日志信息大概为:没有找到xxx文件夹[或目录](这个文件夹是数据库的数据目录下一个文件夹)。有时候以为数据库的数据目录里的某个没有文件的文件夹其实是多余的,就把那个文件夹给删除了,之后启动数据库的时候一直无法找到该文件夹,数据库就会一直报错。解决的办法很简单,在数据目录下建一个需要的名称的文件夹即可。
5.日志信息大概为:已经有一个进程启动。原因是可能由于计算机断电或者postgresql数据库程序被强行关闭的时候导致,由于postgresql数据库判断是否有同一个数据库已经运行是通过该数据库的数据目录下的postgresql.pid文件进行确认的,每次启动数据库都会生成该文件,关闭的时候会删除该文件。所以由于上述问题导致数据库无法启动,只要找到相应的数据库数据目录把该文件删除再启动即可。
6.数据库程序作为WINDOWS服务启动的时候出现提示:本地计算机上的xxx服务启动又停止了。一些服务自动停止,如果他们没有什么可做的,例如:“性能日志和警报”服务。第一次看到这个提示的时候一头雾水,这个提示根本不知道是什么意思,只好去看数据库的日志文件,发现是作为服务的时候启动数据库中填写的数据库数据目录的地址不正确,一般用命令行启动数据库的时候,如果数据目录和数据库的bin目录在同一个目录下,直接用 start -w -D "../data" 即可启动,但是作为服务的时候,寻找的数据目录是以windows/system32为原始的默认目录,所以必须在创建服务的时候填写数据目录的绝对地址。当然导致启动服务失败提示该不知道所云的信息的原因非常多,基本上查看日志文件即可得到真正的错误信息。
7.数据库在简体中文版的WINDOWS XP下能启动,在日语或者其它某些语言下无法启动,这个问题也研究了不少时间,最后发现是由于创建数据库的时候的区域是当时创建数据的的区域(中国),但是又不能直接改为日本的区域,postgresql 的帮助文档上说明区域的信息在创建的时候已经被固定了,无法修改,但是又想让创建的一个数据库同时能在多个区域下甚至在多语言版本的WINDOWS下使用,多次尝试后发现创建的时候使用英语版本的语言(英国或者美国的区域)创建的数据库可以在多语言平台下运行。
8.在WINDOWS 2000 和 2003 下,数据库程序启动还是会失败,提示信息大概为:权限不足。 已经分配了管理员权限的用户给启动Postgresql作为启动用户还是无法解决,经过尝试后发现,启动postgresql使用具有SYSTEM权限的程序启动即可,当然最好的方案是把postgresql作为服务启动,这样问题就解决了。
三.数据库配置文件的简单配置
1.CONNECTIONS AND AUTHENTICATION 连接和认证
1) listen_addresses 默认为'localhost',只有本地的用户可以访问数据库,一般我们都需要设置为 '*',让远程的计算机也可以访问
2) port 默认为 5432 ,一般不太需要改动
3)max_connections 允许的最大连接数,在WINDOWS下一般能有100个连接同时连接过来计算机的压力已经是非常大了,所以基本上不需要设置超过100个
2.RESOURCE USAGE (except WAL) 资源消耗
1) shared_buffers 共享内存,设置大一点的共享内存有效能提高数据库更新的性能,一般开启128MB或者更大
3.ERROR REPORTING AND LOGGING 错误报告和日志
1)log_destination 日志记录方式,一般就用改默认的即可
2)redirect_stderr 把错误日志重定向到文件中,作为维护的其中一个手段,就是需要获取日志信息,所以最好是设置为 on
3)log_directory 日志文件的保存目录,可以是绝对路径或者相对路径,相对路径是以数据库的数据目录为标准
4)log_filename 日志文件名,不仅仅可以按照特定的文件名保存,还可以使用%符号声明随时间而变的文件名。一般建议使用'postgresql-%a.log',这样会记录一周的日志信息,每天一个日志。
5)log_truncate_on_rotation 这个选项将导致 PostgreSQL 覆盖而不是附加到任何同名的现有日志文件上,有时候我们需要设置为 on , 因为如果不停的创建新的日志文件,将会使得硬盘的空间被极大的消耗,所以需要到配置的时间后重新复写到同名日志文件中。
6)log_rotation_age 一个日志文件的最大生存期,安装上面的配置这里配置为 1d (一天),这样每一天的内容只在一个文件里保存。
7)log_rotation_size 一个日志文件的最大日志量。是以日志文件的文件大小作为判断条件,一般设置 10MB 足矣。