通过PG ADMIN中点击数据库可以查看,但是在导出数据库或查询时报如下错误,应该是硬盘有坏道,
现在的问题是我该如何导出数据(主要是保留数据,不能丢啊),用select 查询时也会报这个错F:\pg_8.3\bin\pg_dump.exe -h localhost -p 5432 -U postgres -F c -v -f "G:\20111105德牙数据备份\20111105_db_storelib_outputlog.backup" -t "\"public\".\"tbl_outputlog\"" db_storelib
pg_dump: 读取模式
pg_dump: 读取用户定义函数
pg_dump: 读取用户定义类型
pg_dump: 读取过程语言
pg_dump: 读取用户定义聚集函数
pg_dump: 读取用户定义操作符
pg_dump: 读取用户定义操作符集
pg_dump: 读取用户定义的文本搜索解析器
pg_dump: 读取用户定义的文本搜索模板
pg_dump: 读取用户定义的文本搜索字典
pg_dump: 读取用户定义的文本搜索配置
pg_dump: 读取用户定义操作符
pg_dump: 读取用户定义的字符集转换
pg_dump: 读取用户定义表
pg_dump: 读取表继承信息
pg_dump: 读取重写规则
pg_dump: 读取类型转换
pg_dump: 正在查找关系继承
pg_dump: 正在读取感兴趣表的列信息
pg_dump: 正在查找表 "tbl_outputlog" 的字段和类型
pg_dump: 在子表里标记继承字段
pg_dump: 读取索引
pg_dump: 为表 "tbl_outputlog" 读取索引
pg_dump: 读取约束
pg_dump: 读取触发器
pg_dump: 读取从属数据
pg_dump: 正在保存encoding = UTF8
pg_dump: 正在保存standard_conforming_strings = off
pg_dump: 正在转储表 tbl_outputlog 的内容
pg_dump: SQL 命令失败
pg_dump: 来自服务器的错误信息: ERROR:  invalid page header in block 51 of relation "tbl_outputlog"
pg_dump: 命令是: COPY public.tbl_outputlog (sserialno, iitemno, sitemspce, sitemname, sunit, nprice, icount, ntotalprice, sdatetime, ssaleid, soprid, scustomid, sname, ioprtype, sdetail, ivalid) TO stdout;
pg_dump: *** 因为错误退出
表结构如下:
CREATE TABLE tbl_outputlog
(
  sserialno character varying(100) NOT NULL,
  iitemno integer NOT NULL,
  sitemspce character varying(40),
  sitemname character varying(100) NOT NULL,
  sunit character varying(20),
  nprice numeric(10,2) NOT NULL,
  icount integer NOT NULL,
  ntotalprice numeric(12,2) NOT NULL,
  sdatetime character varying(30),
  ssaleid character varying(40),
  soprid character varying(30),
  scustomid character varying(40),
  sname character varying(50),
  ioprtype integer NOT NULL,
  sdetail character varying(200),
  ivalid integer,
  CONSTRAINT tbl_outputlog_pkey PRIMARY KEY (sserialno, iitemno)
)
WITH (OIDS=FALSE);
ALTER TABLE tbl_outputlog OWNER TO postgres;

解决方案 »

  1.   

    在pg admin点击选中该表后,点击工具栏SQL查询旁边的按钮(冒泡提示为“查看所选对象的数据”),可以看到很多数据,但是用select 语句就会出错,也无法导出数据,
      

  2.   

    你先加 --exclude-table="public.tbl_outputlog" 把此表排除, 把其他数据先导出来可能是此表的某行记录有问题,无法读取, 目前没有修复的工具, 目前的方法是跳过这些坏行, 把其他好的行导出来
    进入psql
    COPY (SELECT * FROM public.tbl_outputlog limit xxx,yyy ) to stdout
    xxx 为起始行
    yyy 为行数
    你只能一个个试, 能导出多少是多少
      

  3.   

    还有个方法, 可导出好的表http://bbs.pgsqldb.com/index.php?t=msg&th=13258&start=0&rid=697&S=86e62f75d19e6c6247d2721a223b5cb0
      

  4.   

    D:\postgresql91\bin>pg_dump --help
    pg_dump 把一个数据库转储为纯文本文件或者是其它格式.用法:
      pg_dump [选项]... [数据库名字]一般选项:
      -f, --file=FILENAME         output file or directory name
      -F, --format=c|d|t|p        output file format (custom, directory,
    text)
      -v, --verbose            详细模式
      -Z, --compress=0-9       被压缩格式的压缩级别
    --lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败
      --help                       显示此帮助信息, 然后退出
      --versoin                    输出版本信息, 然后退出控制输出内容选项:
      -a, --data-only          只转储数据,不包括模式
      -b, --blobs              在转储中包括大对象
      -c, --clean              在重新创建之前,先清除(删除)数据库对象
      -C, --create             在转储中包括命令,以便创建数据库
      -E, --encoding=ENCODING     转储以ENCODING形式编码的数据
      -n, --schema=SCHEMA      只转储指定名称的模式
     -N, --exclude-schema=SCHEMA     不转储已命名的模式
      -o, --oids               在转储中包括 OID
      -O, --no-owner           在明文格式中, 忽略恢复对象所属者  -s, --schema-only        只转储模式, 不包括数据
      -S, --superuser=NAME     在转储中, 指定的超级用户名
      -t, --table=TABLE        只转储指定名称的表
      -T, --exclude-table=TABLE       只转储指定名称的表
      -x, --no-privileges      不要转储权限 (grant/revoke)
      --binary-upgrade         只能由升级工具使用
      --column-inserts          以带有列名的INSERT命令形式转储数据
      --disable-dollar-quoting     取消美元 (符号) 引号, 使用 SQL 标准引
      --disable-triggers         在只恢复数据的过程中禁用触发器
      --inserts                 以INSERT命令,而不是COPY命令的形式转储数
      --no-security-labels        do not dump security label assignments
      --no-tablespaces           不转储表空间分配信息
      --no-unlogged-table-data    do not dump unlogged table data
      --quote-all-identifiers     quote all identifiers, even if not key
      --serializable-deferrable   wait until the dump can run without an
     --use-set-session-authorization
                               使用 SESSION AUTHORIZATION 命令代替
                       ALTER OWNER 命令来设置所有权联接选项:
      -h, --host=主机名        数据库服务器的主机名或套接字目录
      -p, --port=端口号        数据库服务器的端口号
      -U, --username=名字      以指定的数据库用户联接
      -w, --no-password        永远不提示输入口令
      -W, --password           强制口令提示 (自动)
      --role=ROLENAME          do SET ROLE before dump如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量
    的数值.