Postgres 9.2 – 恢复转储正在翻译转义的Unicode和破坏Java序列化的对象

我有一个运行8.4的石英数据库,已经转换为9.2。 Quartz有一个工作job_details表,用于存储序列化的作业数据映射java对象。

数据库的导出没问题,但是当我尝试将sql转储文件导入到postgres中时,它正在翻译unicode。 我已经包含转储文件的摘录以及来自select表的数据。

这个问题很难find。 我一直在网上冲浪,但是距离不远。 我尝试在导入转储之前将编码设置为SQL_ASCII,但似乎也没有解决问题。

我也尝试将转储恢复到8.4数据库,并且表数据确实在qrtz_job_details表中正确显示。

以下是使用8.4版本的pg_dump创build的转储文件的configuration属性

SET statement_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = off; SET check_function_bodies = false; SET client_min_messages = warning; SET escape_string_warning = on; SET search_path = public, pg_catalog; SET default_tablespace = ''; SET default_with_oids = false; 

这是作业转储文件的摘录。

COPY qrtz_job_details (sched_name, job_name, job_group, description, job_class_name, is_durable, is_nonconcurrent, is_update_data, requests_recovery, job_data) FROM stdin; AnalyticsScheduler Fa_ESSN_ISS_Loc_L5_C1_P1_BT&L_FPY_task_Weekly Mon Apr 29 13:05:27 CDT 2013 rscripts \N com.hp.vf.server.scheduler.RExecutionJob ffff \\254\\355\\000\\005sr\\000\\025org.quartz.JobDataMap\\237\\260\\203\\350\\277\\251\\260\\313\\002\\000\\000xr\\000&org.quartz.utils.StringKeyDirtyFlagMap\\202\\010\\350\\303\\373\\305](\\002\\000\\001Z\\000\\023allowsTransientDataxr\\000\\035org.quartz.utils.DirtyFlagMap\\023\\346.\\255(v\\012\\316\\002\\000\\002Z\\000\\005dirtyL\\000\\003mapt\\000\\017Ljava/util/Map;xp\\001sr\\000\\021java.util.HashMap\\005\\007\\332\\301\\303\\026`\\321\\003\\000\\002F\\000\\012loadFactorI\\000\\011thresholdxp?@\\000\\000\\000\\000\\000\\014w\\010\\000\\000\\000\\020\\000\\000\\000\\002t\\000\\017analyticsTaskIdsr\\000\\016java.lang.Long;\\213\\344\\220\\314

psql -d quartz -f 6-20-2013_quartz.dump.out

数据看起来像这样在表中。 在以前的数据库中,我确信它看起来像上面的转义的Unicode字符。

AnalyticsScheduler | Fa_ESSN_ISS_Loc_L5_C1_P1_BT&L_FPY_task_Weekly Mon Apr 29 13:05:27 CDT 2013 | rscripts | | com.vf.server.scheduler.RExecutionJob | f | f | f | f | \xaced

恢复之后的qrtz_job_details表的描述如下所示。 这是运行在Heroku 9.2.4版本的postgres上。

chinshaw =#\ c quartz_86

 quartz_86=# \d qrtz_job_details; Table "public.qrtz_job_details" Column | Type | Modifiers -------------------+------------------------+----------- sched_name | character varying(120) | not null job_name | character varying(200) | not null job_group | character varying(200) | not null description | character varying(250) | job_class_name | character varying(250) | not null is_durable | boolean | not null is_nonconcurrent | boolean | not null is_update_data | boolean | not null requests_recovery | boolean | not null job_data | bytea | Indexes: "qrtz_job_details_pkey" PRIMARY KEY, btree (sched_name, job_name, job_group) "idx_qrtz_j_grp" btree (sched_name, job_group) "idx_qrtz_j_req_recovery" btree (sched_name, requests_recovery) Referenced by: TABLE "qrtz_triggers" CONSTRAINT "qrtz_triggers_sched_name_fkey" FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details(sched_name, job_name, job_group) 

这是在部署转储之后对Postgres 8.4数据库中同一表的描述。 我做了检查,两者没有区别。

 quartz_86=# \d qrtz_job_details; Table "public.qrtz_job_details" Column | Type | Modifiers -------------------+------------------------+----------- sched_name | character varying(120) | not null job_name | character varying(200) | not null job_group | character varying(200) | not null description | character varying(250) | job_class_name | character varying(250) | not null is_durable | boolean | not null is_nonconcurrent | boolean | not null is_update_data | boolean | not null requests_recovery | boolean | not null job_data | bytea | Indexes: "qrtz_job_details_pkey" PRIMARY KEY, btree (sched_name, job_name, job_group) "idx_qrtz_j_grp" btree (sched_name, job_group) "idx_qrtz_j_req_recovery" btree (sched_name, requests_recovery) Referenced by: TABLE "qrtz_triggers" CONSTRAINT "qrtz_triggers_sched_name_fkey" FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details(sched_name, job_name, job_group) 

数据存储在bytea字段中,并且(根据发行说明)PostgreSQL 9.0中默认的bytea输出格式从escapehex

您需要更新的JDBC驱动程序来了解新的格式。 或者,您可以设置bytea_outputescape以恢复旧的行为。 我建议这样做只为需要反向compat设置的用户或数据库:

 ALTER USER quartz_user SET bytea_output = 'escape'; 

要么

 ALTER DATABASE quartz_db SET bytea_output = 'escape';