在分布式系统中,每个数据库都有一个唯一的全局数据库名。全局数据库名能唯一标识系统中的一个数据库。在分布式系统中一个主要的任务就是创建与管理全局数据库名。
1.全局数据库名的组成
一个全局数据库名由两部分组成:一个数据库名与一个域名。在数据库创建时数据库名与域名是由以下参数来决定的。
数据库名:db_name 小于等于30个字符,例如sales
域名: db_domain 必须遵守标准互联网规则。域名中的级别必须通过点号进行分隔并且域名的顺序是从叶子到根,从左到右。
db_domain参数只是在数据库创建时被使用的一个很重要的参数,它与db_name参数一起来决定全局数据库名。全局数据库名是被存储在数据字典中。必须通过alter database语句来改变全局数据库名,不能通过修改参数文件中的db_domain参数来进行修改。
决定是否强制执行全局数据库名
在本地数据库中创建数据链路指定名称时会根据是否强制执行全局数据库名来生成链路名。如果本地数据库强制执行全局数据库名,那么你必须像使用远程数据库全局数据库名作为数据链路名。例如,如果连接到本地数据库hq,并且想创建一个连接到远程数据库的mfg的数据链路,并且本地数据库强制执行全局数据库名,那么必须使用mfg全局数据库名作为链路名。
在创建数据链路时也可以使用服务名作为数据库链路名的一部分。例如,如果使用服务名sn1和sn2来连接数据库hq.example.com,并且全局数据库名被强制执行时,那么可以对数据库hq创建以下链路名:
hq.example.com@sn1
hq.example.com@sn2
为了判断数据库是否启用了全局数据库名,可以检查数据库初始化参数文件或查询v$parameter视图。例如,为了查看对数据库mfg是否强制执行全局数据库名,可以执行以下语句来进行查询:
SQL> col name format a12 SQL> col value format a6 SQL> select name, value from v$parameter where name = 'global_names' 2 / NAME VALUE ------------ ------ global_names FALSE
查看全局数据库名
可以查询视图global_name来查看全局数据库名
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JYPDB
修改全局数据库名中的域名
可以使用alter database语句来改变全局数据库名中的域名。在数据库创建之后,修改db_domain参数不会影响全局数据库名或数据库链路名。下面的例子显示重命名全局数据库名的语句,database是数据库名,domain是网络域名:
alter database rename global_name to database.domain;
修改全局数据库名的操作如下:
1.判断当前的全局数据库名:
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY
2.执行alter database语句来修改全局数据库名
SQL> alter database rename global_name to jy.jydba.net; Database altered.
3.查询视图global_name来检查新的全局数据库
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY.JYDBA.NET
4.修改全局数据库名中的域名
使用alter database语句来修改全避数据库名中的域名。在数据库创建之后,修改初始化参数db_domain不会影响全局数据库名或对数据库链路名的解析。下面的例子显示了修改全局数据库名的语法,database是数据库名,domain是网络域名:
alter database rename global_name to database.domain;
使用下面的过程来修改全局数据库名中的域名:
1.判断当前全局数据库名。
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY.JYDBA.NET
2.使用alter database语句来修改全局数据库名
SQL> alter database rename global_name to jy.changde.net; Database altered
3.查询global_name表来检查新的全局数据库名
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY.CHANGDE.NET
下面将介绍修改全局数据库名的场景
在这种情况下,可以修改本地数据库的全局数据库名中的域名部分。也可以使用全局名来创建数据链路来测试数据库是如何解析链路名的。
1.连接到jy.jydba.net并查询global_name数据字典视图来判断当前的数据为全局名:
SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY.JYDBA.NET
2.查询v$parameter视图来判断db_domain参数的当前值
SQL> select name, value from v$parameter where name = 'db_domain'; NAME VALUE ------------------------------- ---------------- db_domain
3.创建一个连接到数据库sjjh的数据链路,保指定全局名的一部分:
SQL> create database link dblink_test using 'sjjh'; Database link created
数据库会通过将本地数据库的全局数据库名中的域名部分增加到数据链路的全局名中
4.查询user_db_links来判断数据链路的域名
SQL> select db_link from user_db_links; DB_LINK -------------------------------------------------------------------------------- DBLINK_TEST.JYDBA.NET
查询结果显示,本地数据库的全局名中的域名jydba.net被用来作为数据链路的域名
5.因为要将数据库jy移到changde.net这个域中,所以执行以下操作
SQL> alter database rename global_name to jy.changde.net; Database altered SQL> select * from global_name; GLOBAL_NAME -------------------------------------------------------------------------------- JY.CHANGDE.NET
6.查询v$parameter发现db_domain参数并没有修改
SQL> select name, value from v$parameter where name = 'db_domain'; NAME VALUE ------------------------------- ---------------- db_domain
这也就说明了db_domain参数是独立于alter database rename global_name语句的。alter database语句决定了全局数据库名中的域名。
7.可以创建另一个数据链路来连接数据库sjjh,并查询user_db_links来查看数据链路中的域名
SQL> create database link dblink_cs using 'sjjh'; Database link created SQL> select db_link from user_db_links; DB_LINK -------------------------------------------------------------------------------- DBLINK_CS.CHANGDE.NET DBLINK_TEST.JYDBA.NET
可以看到新创建的数据链路的域名,是使用当前本地数据库全局数据库名中的域名。