Oracle 11gR2:NLS_CHARACTERSET用UPDATE-Query意外删除

我在CentOS上安装了Oracle 11gr2_x64。 安装后,我想获得生产力,并开始导入我的转储。 其中一个转储导致了字符集错误,所以我试图将系统字符集更改为转储中指定的字符集。

我跑了这样一个声明:

UPDATE nls_database_parameters SET parameter='WS....' WHERE parameter='NLS_CHARACTERSET'; 

正如你所看到的:我已经将字符集的值写入了参数列而不是值列。 我想我只是太多的思考问题,而不是检查我在那里打字。 在查询之后,参数“NLS_CHARACTERSET”消失,服务器报告字符集是“(null)”。

我想把“NLS_CHARACTERSET”参数放回表中,但不知道如何。 如果我尝试做这样的事情

 INSERT INTO nls_database_parameters (PARAMETERS, VALUE) VALUES ("NLS_CHARACTERSET", "AL32UTF8"); 

我得到的错误:

 Fehler bei Befehlszeile:1 Spalte:84 Fehlerbericht: *Cause: SQL-Fehler: ORA-00984: Spalte hier nicht zulässig *Action: 00984. 00000 - "column not allowed here" 

抱歉,错误消息是德文,但它包含Oracle错误代码。

你有什么想法我可以解决这个问题吗?

感谢和最好的问候

马尔科

你的第一个错误是修改SYS拥有的对象。 您不应该更新/删除/截断SYS拥有的任何对象,除非得到支持明确告知。 Oracle提供了API(包)和DDL命令(ALTER DATABASE等)来与系统对象进行交互,而不应该使用其他任何东西。

现在,这不是你如何改变数据库字符集。 谷歌的第一个命中 “oracle更改字符集”提供了一个如何改变你的字符集的例子。

由于这是全新的安装,我build议你咬紧牙关,重新安装一个干净的数据库与所需的字符集。 如果你真的不想重新安装,我build议你联系支持。

编辑

有意思的是,我浏览了MOS支持网站以了解如何更改字符集,并且发现了这个注释。 更改数据库字符集 [225912.1]和这个有趣的注释:

仍然有“dba的”谁试图通过更新道具$来更改NLS_CHARACTERSET或NLS_NCHAR_CHARACTERSET。 这不被支持,并会损坏你的数据库。 这是销毁完整数据集的最好方法之一。 Oracle支持将试图帮助您解决这个问题,但Oracle不保证数据可以恢复或恢复数据是正确的。 您将被要求做一个全导出和一个完整的数据库重build。

请不要更新道具$。

我自己解决了

如果您浏览Oracle数据库的表列表,那么您有一个名为“PROPS $”的表。 我发现我的错误覆盖的列如下所示:

 Parameter Value WE8ISO8859P1, AL32UTF8 

我用SQLDeveloper将列更新回“NLS_CHARACTERSET”,我的数据库再次正常运行。

表“NLS_DATABASE_PARAMETERS”只是一个视图,它过滤了几个参数表。 我想我只是不能在该视图上运行更新并将其列出。 我现在要做一些关于如何更改字符集的研究。

感谢您的帮助和build议!

马尔科