Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307506
  • 博文数量: 81
  • 博客积分: 3813
  • 博客等级: 中校
  • 技术积分: 945
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-24 18:14
文章分类

全部博文(81)

文章存档

2013年(1)

2012年(2)

2011年(54)

2010年(15)

2009年(9)

分类: Mysql/postgreSQL

2011-02-09 16:29:24

PostgreSQL单用户模式通过以下语法来调用:
postgres –single -D $PGDATA db_name
可选选项:
-E
echo all commands
-j
Disables use of newline as a statement delimiter.
-r $FILENAME
Send all server log output to filename. In normal multiuser mode, this option is ignored, and stderr is used by all processes.

单用户模式典型的应用,1.当多用户模式不接收所有命令时, 2.initdb时 3.修复系统表。
例如:
数据库中任何带relfrozenxid标记的记录,年龄不能超过2^31(二十亿);当数据库中存在年龄大于{(2^31)-1千万}的记录时,数据库将报类似如下提示:

WARNING: database “mydb” must be vacuumed within 177009986 transactions

HINT: To avoid a database shutdown, execute a database-wide VACUUM in “mydb”.

  1. 提示需要手工的消除这些警告,如果忽略不去处理的话,后面数据库可能需要关闭来处理,下面会提到.处理的方法是使用超级用户
  2. VACUUM mydb.
  3. (这里用到超级用户的原因是需要更新系统表的datfrozenxid列值)
  4. 如果忽略上面的警告,当数据库中存在年龄大于{(2^31)-1百万}的记录时,数据库将报类似如下错误:
  5. ERROR: database is not accepting commands to avoid wraparound data loss in database "mydb"
  6. HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
  7. 数据库将不再新建任何新的事务,只能通过单用户模式修复。
  8. (100万被认为是一个比较安全的临界值,管理员可以在此年龄范围内对数据库进行VACUUM修复,)
  9. 单用户使用举例:
  10. # su - postgres
  11. (确保数据库已经关闭)
  12. $ postgres --single mydb_name
  13. postgres@db-bak-192-168-105-35-> postgres --single rmt_rescue
  14. PostgreSQL stand-alone backend 9.0.1
  15. backend> vacuum full; (不带任何参数的VACUUM将对所有当前用户有权限的表进行操作)
  16. backend> Ctrl+D 退出单用户模式.
  17. 附录:
  18. 1. 查看表的年龄:
  19. rmt_rescue=> SELECT relname, age(relfrozenxid) FROM pg_class WHERE relname='tbl_test1';
  20. relname | age
  21. -----------+-----
  22. tbl_test1 | 14
  23. (1 row)
  24. 2. 查看数据库的年龄:
  25. rmt_rescue=> select datname,age(datfrozenxid) from pg_database;
  26. datname | age
  27. ------------+--------
  28. template1 | 8099
  29. template0 | 676734
  30. postgres | 676734
  31. rmt_rescue | 676734
  32. (4 rows)
  33. 3. 查看表中记录的年龄:
  34. rmt_rescue=> select id,ctid,cmin,cmax,xmin,xmax,age(xmin),age(xmax) from tbl_test where id=1;
  35. id | ctid | cmin | cmax | xmin | xmax | age | age
  36. ----+-------+------+------+--------+------+-----+------------
  37. 1 | (0,1) | 0 | 0 | 677333 | 0 | 53 | 2147483647
  38. (1 row)
  39. 年龄=53
  40. rmt_rescue=> update tbl_test set name='test' where id=1;
  41. UPDATE 1
  42. rmt_rescue=> select id,ctid,cmin,cmax,xmin,xmax,age(xmin),age(xmax) from tbl_test where id=1;
  43. id | ctid | cmin | cmax | xmin | xmax | age | age
  44. ----+------------+------+------+--------+------+-----+------------
  45. 1 | (4424,177) | 0 | 0 | 677387 | 0 | 1 | 2147483647
  46. (1 row)
  47. 更新该记录后,年龄=1.
  48. 4. 年龄:
  49. normal xid和当前事务id进行比较得到的一个值.SELECT语句也会增加数据库当前事务ID的值.
  50. 还有一种比较特殊的XID不参与比较,在任何状态下都被视为"in the past"状态,这就是frozenxid,使用vacuum freezen或vacuum且
  51. 当年龄大于vacuum_freeze_min_age时可以将tuple的XID转换为in the past状态,不过update后XID又会回到NORMAL状态.因此建议将
  52. vacuum_freeze_min_age设置为: tuple从创建到不会被更新所经过的年龄是比较合适的.
  53. 5. age函数
  54. List of functions
  55. Schema | Name | Result data type | Argument data types | Type
  56. ------------+------+------------------+----------------------------------------------------------+--------
  57. pg_catalog | age | interval | timestamp with time zone | normal
  58. pg_catalog | age | interval | timestamp with time zone, timestamp with time zone | normal
  59. pg_catalog | age | interval | timestamp without time zone | normal
  60. pg_catalog | age | interval | timestamp without time zone, timestamp without time zone | normal
  61. pg_catalog | age | integer | xid | normal
  62. (5 rows)
  63. 6.1
  64. vacuum
  65. VACUUM 的NORMAL模式,只扫描含有DEAD TUPLES的PAGE,其他不扫描。(因此在没有DEAD TUPLES的PAGE中的年龄大于
  66. vacuum_freeze_min_age的记录不会被FREEZE掉,当然在含有DEAD TUPLES中的年龄大于
  67. vacuum_freeze_min_age的记录是被FREEZE掉的)
  68. 6.2
  69. vacuum full
  70. VACUUM的FULL模式,扫描所有PAGE


阅读(1287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~