我在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议!
马尔科