Postgres 9.2-还原转储正在转换转义的unicode并破坏java序列化对象

Postgres 9.2-还原转储正在转换转义的unicode并破坏java序列化对象,java,linux,postgresql,database-schema,psql,Java,Linux,Postgresql,Database Schema,Psql,我有一个运行8.4的quartz数据库,并已转换为9.2。Quartz有一个job job_details表,用于存储序列化的job data map java对象 数据库的导出进行得很顺利,但当我尝试将sql转储文件导入postgres时,它正在转换unicode。我已经包括了转储文件的一个摘录,以及来自表的select部分的数据 很难找到解决这个问题的办法。我一直在网上搜寻,但没走多远。在导入转储之前,我尝试将编码设置为SQL_ASCII,但这似乎也无法解决问题 我还尝试将转储恢复到8.4数

我有一个运行8.4的quartz数据库,并已转换为9.2。Quartz有一个job job_details表,用于存储序列化的job data map java对象

数据库的导出进行得很顺利,但当我尝试将sql转储文件导入postgres时,它正在转换unicode。我已经包括了转储文件的一个摘录,以及来自表的select部分的数据

很难找到解决这个问题的办法。我一直在网上搜寻,但没走多远。在导入转储之前,我尝试将编码设置为SQL_ASCII,但这似乎也无法解决问题

我还尝试将转储恢复到8.4数据库,表数据确实正确地显示在qrtz_job_details表中


以下是使用8.4版pg_dump创建的转储文件中的配置属性

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;

这是作业转储文件的摘录


从stdin复制qrtz\u作业详细信息(计划名称、作业名称、作业组、描述、作业类名称、持久、非当前、更新数据、请求恢复、作业数据);
分析调度程序Fa_ESSN_ISS_Loc_L5_C1_P1_BT&L_FPY_task_每周周一4月29日13:05:27 CDT 2013 RScript\N com.hp.vf.server.scheduler.RExecutionJob f\\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\\014w\\010\\000\\000\\000\\000\\000\\020\\000\\000\\020\\000\\000\\017analysticstaticsr\\213lang\\344\\220\\314


psql-d石英-f 6-20-2013_quartz.dump.out

表中的数据如下所示。在以前的数据库中,我确信它确实类似于上面转义的unicode字符



分析调度程序| Fa|ESSN|ISS|u Loc L5|u C1|P1|BT&L|FPY|u task|周一4月29日13:05:27 CDT 2013 | rscript | com.vf.server.scheduler.RExecutionJob | f | f | f | f | f | f | f | f | f | f | xaced00057372006f722e7f672e7f71756172727272727266F726722E71756172747A2E7574696C732E537472696E674B657944697274466C61674D61708208E8C3FBC55D280200015A0013616C6C6F7775472616E7369656E7461747872001D6F72672E71756172747A2E7574696C732E44697274466C61674D617013E6AD28760ACE025A00056797D670746767676767676767D677676767676767676767E47676767677D676767676767676767674D6707017E6767677E682E682AD28767676767676767676767676767676767676767D677D677D677D677B76767676767676C1C31660D10300024600A6C6F6164466163746F72490097468726573686F6C6478703F400000000C7700000100000000274000F616E616C79746963735461736B49647372000E6A6176612E6C616E672E672E672E690CC8F23DF0200014A000576616C75787200106F400000000C776E616E672E672E756D672E950B948B0027000076767E47672E47677E677C27676767E47677C27676767676767E47677E7676767676767676767E47677E47677C276767676767676767676767676767E76767676767261794C6973747881D21D99C7619D030001490004773697A6578700000001A77040002673720021636F6D2E68702E76662E7365727665722E646F6D61696E2E44617465496E707574AB57D72B765C0640000014C000576616C75657400104C6A6176612F7574696C2F4461743B7872002F636F6D6E6870757472E687072E766


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

金肖=#\c石英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
字段中,并且(根据发行说明)默认的bytea输出格式在PostgreSQL 9.0中从
escape
更改为
hex

您需要一个更新的JDBC驱动程序来理解新的格式。或者,您可以将
bytea_output
设置为
escape
,以恢复旧的行为。我建议仅对需要向后兼容设置的用户或数据库执行此操作:

ALTER USER quartz_user SET bytea_output = 'escape';


你真的应该在
psql
中显示
\d qrtz\u job\u details
的输出,这样我们就可以看到表的定义了。Craig,非常感谢。我很快就要尝试一下,并很乐意接受答案。我确实有一个简短的问题,尽管我正在为Postgres使用9.1-901 jdbc驱动程序,但它似乎没有正确读取对象ly。奇怪的是,它没有给我一个序列化错误,但读取时对象返回为null。我将尝试将bytea列再次切换为使用Escape,看看这是否能解决我的问题。我还更新了这个问题,以防其他人偶然发现这个问题。@ChrisHinshaw有趣,我希望是PgJ9.1中的DBC来处理这两种bytea输出格式。也许还有别的事情……我建议编写一个小测试用例程序,打开一个连接,按ID选择一行,然后获取数据——看看你是否可以在一个独立的测试用例中复制这个问题。克雷格,谢谢你的帮助。你的答案很准确!我后来发现了postgres 9.1 jdbc驱动程序完全按照预期工作,只要您有正确的jdbc驱动程序版本,您使用的是转义还是十六进制都无关紧要。问题在于Quartz和RMI上的触发器类。当将数据库导入9.0+b时,我很困惑postgres在转义unicode上做了一些转换ytea表格。只需尝试“将bytea_输出设置为“escape”;”并在exape模式下查看数据,即可验证此设置。@ChrisHinsh
ALTER DATABASE quartz_db SET bytea_output = 'escape';