oracle的那些名字,那些事

本文解析了Oracle数据库中数据库名、全局名、服务名、实例名和别名的概念及其相互关系,帮助初学者理解如何配置和管理Oracle数据库。
对于初学者,oracle的很多名字令人迷茫。我也是哈。数据库名-全局名-服务名-实例名-别名之间的关系,剪不断,理还乱,理解了,别有一番滋味在心头。

SQL> show parameter name


NAME TYPE VALUE
------------------------------------ ---------------------------------

db_name string orcl
db_unique_name string orcl
global_names boolean FALSE
instance_name string orcl
service_names string orcl.oracle.com

缺省下,这些名字都是一样的。下面我们来学习一下这几个name。注意,这里的global_names不是全局数据库名哦。


NO.1
Service_name:为实例所连接的数据库定义一个或多个服务名。可以通过定义多个服务名将不同的用户区分开来,如销售用户可以在客服端定义sales服务名来访问连接,新闻用户可以通过news服务名来进行连接,这样,用户可以不必关心数据库是哪一个,他们只要知道服务名便可。这个参数的缺省格式是:**.db_domain。因此,监听配置时,在客服端的TNSNAMES.ORA文件配置中,service_name和sid是可以互相替换的,但oracle建议,用service_name而不是sid。在客户端配置完tnsname后,记得tnspingservice_name测试一下。若能tnsping通的话,就可以conn user/pwd@service_name.


NO.2
db_name:是数据库的身份证号。是启动到nomount的最小参数。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。在创建数据库时就应考虑好数据库名,
并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内
容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。


NO.3
instance_name:实例名是可以随便修改的。下面来测试一下:
当实例名为orcl时:
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 16 14:49:47 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount
ORACLE instance started.


Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 125829968 bytes
Database Buffers 289406976 bytes
Redo Buffers 2973696 bytes
SQL> create pfile from spfile;
File created.

SQL> !ls $ORACLE_HOME/dbs
hc_orcl.dat init.ora lkORCL spfileorcl.ora
initdw.ora initorcl.ora orapworcl


SQL> !ps -ef|grep ora_
oracle 1695 1 0 14:50 ? 00:00:00 ora_pmon_orcl
oracle 1697 1 0 14:50 ? 00:00:00 ora_psp0_orcl
oracle 1699 1 0 14:50 ? 00:00:00 ora_mman_orcl
oracle 1701 1 0 14:50 ? 00:00:00 ora_dbw0_orcl
oracle 1703 1 0 14:50 ? 00:00:00 ora_lgwr_orcl
oracle 1705 1 0 14:50 ? 00:00:00 ora_ckpt_orcl
oracle 1707 1 0 14:50 ? 00:00:00 ora_smon_orcl
oracle 1709 1 0 14:50 ? 00:00:00 ora_reco_orcl
oracle 1711 1 0 14:50 ? 00:00:00 ora_cjq0_orcl
oracle 1713 1 0 14:50 ? 00:00:00 ora_mmon_orcl
oracle 1715 1 0 14:50 ? 00:00:00 ora_mmnl_orcl
oracle 1717 1 0 14:50 ? 00:00:00 ora_d000_orcl
oracle 1719 1 0 14:50 ? 00:00:00 ora_s000_orcl
oracle 1739 1687 0 14:51 pts/2 00:00:00 /bin/bash -c ps -ef|grepora_


当实例名为think时:
[oracle@localhost ~]$ export ORACLE_SID=think
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Jul 16 15:00:16 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup nomount


pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initorcl.ora';
ORACLE instance started.

Total System Global Area 419430400 bytes
Fixed Size 1219760 bytes
Variable Size 121635664 bytes
Database Buffers 293601280 bytes
Redo Buffers 2973696 bytes
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
think
SQL> !ps -ef|grep ora_
oracle 1937 1 0 15:01 ? 00:00:00 ora_pmon_think
oracle 1939 1 0 15:01 ? 00:00:00 ora_psp0_think
oracle 1941 1 0 15:01 ? 00:00:00 ora_mman_think
oracle 1943 1 0 15:01 ? 00:00:00 ora_dbw0_think
oracle 1945 1 0 15:01 ? 00:00:00 ora_lgwr_think
oracle 1947 1 0 15:01 ? 00:00:00 ora_ckpt_think
oracle 1949 1 0 15:01 ? 00:00:00 ora_smon_think
oracle 1951 1 0 15:01 ? 00:00:00 ora_reco_think
oracle 1953 1 0 15:01 ? 00:00:00 ora_cjq0_think
oracle 1955 1 0 15:01 ? 00:00:00 ora_mmon_think
oracle 1957 1 0 15:01 ? 00:00:00 ora_mmnl_think
oracle 1959 1 0 15:01 ? 00:00:00 ora_d000_think
oracle 1961 1 0 15:01 ? 00:00:00 ora_s000_think
oracle 2055 1911 0 15:06 pts/3 00:00:00 /bin/bash -c ps -ef|grepora_
oracle 2057 2055 0 15:06 pts/3 00:00:00 grep ora_



NO.4
global_name:如果是分布式数据库,db_name会出现重名。global_name是对db_name的扩展。管理上采用和service_name一样的方式。即:加个db.domain。在db link时,必须关心一下global_name.这个缺省下,是作为网络服务名对外提供服务的。但大部分我们是不用的。
SQL> show parameter global_names


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
GLOBAL_NAMES参数并不是用来控制GLOBAL_NAME的,而是用来限制DBLINK的使用.GLOBAL_NAMES参数的作用,简单得说来就是:当GLOBAL_NAMES参数设置为TRUE时,使用DBLINK的名称必须与被连接库的GLOBAL_NAME一致。
SQL> select * from global_name;

GLOBAL_NAME
------------------------------------------------------------------------------------------------------------------------------------------------------
ORCL.ORACLE.COM

全局数据库名可以从视图global_name里面获取。


NO.5
db_unique_name
是数据库的别名,小名。在initorcl.ora中修改。配置DG时需要关心他。
<think>好的,我现在需要回答用户关于如何在Oracle数据库中修改索引名称的问题。首先,我得确认用户的具体需求,他们想知道正确的语法和方法来重命名索引。根据之前提供的引用内容,用户提到了使用ALTER INDEX语句,但可能还需要更详细的步骤或注意项。 首先,我应该回忆Oracle的官方文档或者可靠的资料,确认ALTER INDEX ... RENAME TO是正确的方法。比如,引用中的例子是ALTER INDEX idx_emp_empnoname RENAME TO idx_ename_empno;,这说明语法结构是正确的。不过需要验证是否有版本限制或者其他前提条件。 接下来,我需要考虑用户可能的操作环境,比如Oracle的版本是否支持这个语句。例如,某些旧版本可能不支持直接重命名索引,而需要使用其他方法,比如删除后重建。但根据当前知识,ALTER INDEX ... RENAME TO应该是标准方法,适用于大多数现代版本。 另外,需要注意权限问题。执行这个操作的用户必须拥有ALTER ANY INDEX的权限,或者是该索引的所有者。如果用户遇到权限不足的错误,可能需要提示他们检查权限。 还有,是否需要表空间在线或者索引是否处于可用状态?比如,如果索引处于不可用状态,可能无法重命名。或者重命名操作是否会影响正在使用该索引的应用程序?需要指出在操作时最好在维护窗口进行,避免影响业务。 然后,是否有其他方法可以实现重命名,比如使用数据字典表直接修改名称?不过这种方法是不推荐的,因为直接修改数据字典可能导致数据库不一致,甚至损坏数据。所以必须强调只能使用官方提供的SQL命令。 可能还需要给出具体的步骤,比如: 1. 确认当前索引名称和所属表。 2. 使用ALTER INDEX语句执行重命名。 3. 验证名称是否修改成功,可以通过查询USER_INDEXES视图检查。 另外,用户可能会有疑问,如果索引是主键或唯一约束的一部分,重命名索引是否会影响约束?需要说明,重命名索引不会影响关联的约束,约束的名称和索引的名称是分开的。但需要注意的是,如果约束本身需要重命名,应该使用ALTER TABLE ... RENAME CONSTRAINT语句。 最后,是否需要示例代码和验证步骤?比如,修改后的验证查询语句,确保用户能够确认操作成功。例如,执行SELECT index_name FROM user_indexes WHERE table_name = '表名';来查看新的索引名称。 总结下来,回答应该包括正确的语法、步骤说明、权限要求、注意项以及验证方法,可能还要提到相关约束的影响。确保用户能够安全有效地完成索引重命名操作,避免常见错误。</think>在Oracle数据库中修改索引名称的标准方法是使用`ALTER INDEX`语句配合`RENAME TO`子句。以下是具体操作步骤和注意项: --- ### **步骤说明** 1. **确认当前索引名称** 通过数据字典视图`USER_INDEXES`或`DBA_INDEXES`查询现有索引名称: ```sql SELECT index_name, table_name FROM user_indexes WHERE table_name = 'YOUR_TABLE'; ``` 2. **执行重命名操作** 使用以下语法修改索引名称: ```sql ALTER INDEX 原索引名称 RENAME TO 新索引名称; ``` **示例**:将索引`idx_old`重命名为`idx_new`: ```sql ALTER INDEX idx_old RENAME TO idx_new; ``` 3. **验证修改结果** 重新查询数据字典视图确认名称已更新: ```sql SELECT index_name FROM user_indexes WHERE table_name = 'YOUR_TABLE'; ``` --- ### **注意项** 1. **权限要求** 用户需具备以下权限之一: - 索引的所有者(即创建者) - `ALTER ANY INDEX`系统权限 2. **索引状态** - 索引必须处于有效状态(VALID)。若索引已失效,需先通过`ALTER INDEX ... REBUILD`修复。 - 重命名操作不会影响索引的可用性,但需避免在业务高峰期操作。 3. **约束关联性** - 若索引关联了主键或唯一约束,重命名索引不会影响约束名称。约束名称需通过`ALTER TABLE ... RENAME CONSTRAINT`单独修改。 4. **兼容性** 该方法适用于Oracle 10g及以上版本[^1]。对于更早版本,需通过重建索引实现重命名。 --- ### **替代方案(不推荐)** 若因特殊原因无法使用`ALTER INDEX`,可通过重建索引间接实现重命名: ```sql -- 删除原索引 DROP INDEX idx_old; -- 新建同名索引(需重新定义列和参数) CREATE INDEX idx_new ON your_table(column_name); ``` 但此方法会导致索引统计信息丢失,且可能影响查询性能,仅作为备选方案。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值