暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Administrator's Guide(Oracle 19c):2.5 Specifying CREATE DATABASE Statement Clauses

原创 Ryan Bai 2024-04-23
195

当你执行一条 CREATE DATABASE 语句时,Oracle 数据库会执行一些操作。实际执行的操作取决于您在 CREATE DATABASE 语句中指定的子句和您设置的初始化参数。

关于 CREATE DATABASE 语句子句

您可以使用 CREATE DATABASE 子句来简化数据库的创建和管理。

当你执行 CREATE DATABASE 语句时,Oracle 数据库至少会执行以下操作:

  • 创建数据库数据文件

  • 创建数据库的控制文件

  • 创建数据库的在线重做日志,并建立 ARCHIVELOG 模式

  • 创建 SYSTEM 表空间

  • 创建 SYSAUX 表空间

  • 创建数据字典

  • 设置存储数据库数据的字符集

  • 设置数据库时区

  • 挂载并打开数据库供使用

保护数据库:为 SYS 和 SYSTEM 用户指定密码

为保护数据库,请为 SYSSYSTEM 用户指定密码。

  • CREATE DATABASE 语句中,包含为用户 SYSSYSTEM 指定密码的子句。

用于指定用户 SYSSYSTEM 密码的 CREATE DATABASE 语句的子句有:

  • USER SYS IDENTIFIED BY password
  • USER SYSTEM IDENTIFIED BY password

在选择密码时,请记住密码是区分大小写的。此外,数据库可能有密码格式要求。

创建本地管理 SYSTEM 表空间

在创建数据库期间,创建一个本地管理的 SYSTEM 表空间。本地管理的表空间使用存储在每个数据文件中的位图来管理区段。

  • CREATE DATABASE 语句中指定 EXTENT MANAGEMENT LOCAL 子句来创建本地管理的 SYSTEM 表空间。

如果没有指定 EXTENT MANAGEMENT LOCAL 子句,那么默认情况下,数据库将创建一个字典管理的 SYSTEM 表空间。不建议使用字典管理的表空间。

如果你使用本地管理的 SYSTEM 表空间创建数据库,并且你没有使用 Oracle managed Files,那么请确保满足以下条件:

  • 你在 CREATE DATABASE 语句中指定了 DEFAULT TEMPORARY TABLESPACE 子句。

  • CREATE DATABASE 语句中包含 UNDO TABLESPACE 子句。

指定 SYSAUX 表空间的数据文件属性

SYSAUX 表空间是默认创建的,但是您可以在创建数据库时指定它的数据文件属性。

SYSAUX 表空间指定数据文件属性。

  • CREATE DATABASE 语句中包含 SYSAUX DATAFILE 子句。

如果在表空间 SYSTEM 中包含 DATAFILE 子句,则必须同时指定 SYSAUX DATAFILE 子句,否则 CREATE DATABASE 语句将失败。如果启用了 Oracle Managed Files 特性,则不存在此要求。

关于 SYSAUX 表空间

SYSAUX 表空间总是在数据库创建时创建的。SYSAUX 表空间作为 SYSTEM 表空间的辅助表空间。因为它是许多 Oracle 数据库特性和产品的默认表空间,这些特性和产品以前需要它们自己的表空间,所以它减少了数据库所需的表空间的数量。它还减少了 SYSTEM 表空间的负载。

您可以使用 CREATE DATABASE 语句中的 SYSAUX DATAFILE 子句为 SYSAUX 表空间指定数据文件属性。SYSAUX 表空间的强制属性是由 Oracle 数据库设置的,包括:

  • PERMANENT
  • READ WRITE
  • EXTENT MANAGMENT LOCAL
  • SEGMENT SPACE MANAGMENT AUTO

你不能用 ALTER TABLESPACE 语句改变这些属性,任何这样做的尝试都会导致错误。不能删除或重命名 SYSAUX 表空间。

SYSAUX 表空间的大小由占用 SYSAUX 的数据库组件的大小决定。你可以通过查询 V$SYSAUX_OCCUPANTS 视图来查看这些组件的列表。根据这些组件的初始大小,SYSAUX 表空间在创建数据库时必须至少有 400 MB。在数据库完全部署之后,SYSAUX 表空间的空间需求将会增加,这取决于数据库的使用性质和工作负载。

SYSAUX 表空间与 SYSTEM 表空间具有相同的安全属性。

使用自动 UNDO 管理:创建 UNDO 表空间

自动 UNDO 管理使用 UNDO 表空间。

  • 要启用自动 UNDO 管理,在初始化参数文件中将 UNDO_MANAGEMENT 的初始化参数设置为 AUTO。或者,省略此参数,数据库默认为自动撤消管理。

在此模式下,UNDO 数据存储在 UNDO 表空间中,由 Oracle 数据库管理。要自己定义和命名 UNDO 表空间,必须在创建数据库时在 CREATE DATABASE 语句中包含 UNDO TABLESPACE 子句。如果省略此子句,并且启用了自动 UNDO 管理,那么数据库将创建一个名为 SYS_UNDOTBS 的默认 UNDO 表空间。

创建默认永久表空间

Oracle 强烈建议您创建一个默认的永久表空间。如果你没有明确指定一个不同的永久表空间,Oracle 数据库会将任何非 SYSTEM 用户分配给这个表空间。

为数据库指定默认的永久表空间。

  • CREATE DATABASE 语句中包含 DEFAULT TABLESPACE 子句

如果你没有指定 DEFAULT TABLESPACE 子句,那么 SYSTEM 表空间是非 SYSTEM 用户的默认永久表空间。

创建默认临时表空间

在创建默认临时表空间时,Oracle 数据库会将其分配给没有明确分配临时表空间的用户作为临时表空间。

为数据库创建默认的临时表空间。

  • CREATE DATABASE 语句中包含 DEFAULT TEMPORARY TABLESPACE 子句

可以在 CREATE USER 语句中显式地为用户分配临时表空间或表空间组。但是,如果您不这样做,并且如果没有为数据库指定默认的临时表空间,那么在默认情况下,这些用户将被分配 SYSTEM 表空间作为他们的临时表空间。在 SYSTEM 表空间中存储临时数据不是一个好习惯,而且为每个用户单独分配临时表空间也很麻烦。因此,Oracle 建议您使用 CREATE DATABASE 中的 DEFAULT TEMPORARY TABLESPACE 子句。

在创建数据库时指定Oracle托管文件

通过使用 Oracle Managed Files 特性,您可以最小化在 CREATE DATABASE 语句中指定的子句和参数的数量。

  • 指定一个目录或 Oracle ASM 磁盘组,Oracle 数据库将在其中创建和管理您的文件。

通过在初始化参数文件中包含任何初始化参数 DB_CREATE_FILE_DESTDB_CREATE_ONLINE_LOG_DEST_n,或 DB_RECOVERY_FILE_DEST,可以指示 Oracle 数据库创建和管理数据库底层的操作系统文件。Oracle 数据库自动创建和管理以下数据库结构的操作系统文件,取决于你指定的初始化参数以及你如何在 CREATE DATABASE 语句中指定的子句:

  • 表空间及其数据文件

  • 临时表空间及其临时文件

  • 控制文件

  • 联机重做日志

  • 归档重做日志文件

  • 闪回日志

  • 块更改跟踪文件

  • RMAN备份

假设您已经指定了必需的初始化参数,下面的 CREATE DATABASE 语句简要展示了 Oracle Managed Files 特性的工作原理:

CREATE DATABASE mynewdb USER SYS IDENTIFIED BY sys_password USER SYSTEM IDENTIFIED BY system_password EXTENT MANAGEMENT LOCAL UNDO TABLESPACE undotbs1 DEFAULT TEMPORARY TABLESPACE tempts1 DEFAULT TABLESPACE users;
  • SYSTEM 表空间创建为本地管理表空间。如果没有 EXTENT MANAGEMENT LOCAL 子句,SYSTEM 表空间将被创建为受字典管理的表空间,这是不推荐的。
  • 如果没有指定 DATAFILE 子句,则数据库将为 SYSTEM 表空间创建一个 Oracle 管理数据文件。
  • 不包含 LOGFILE 子句,因此数据库创建两个 Oracle 管理重做日志文件组。
  • 没有包含 SYSAUX DATAFILE,因此数据库为 SYSAUX 表空间创建一个 Oracle 管理数据文件。
  • UNDO TABLESPACEDEFAULT TABLESPACE 子句中没有指定 DATAFILE 子句,因此数据库会为每个表空间创建一个 Oracle 管理数据文件。
  • 没有为 DEFAULT TEMPORARY TABLESPACE 子句指定 TEMPFILE 子句,因此数据库创建一个 Oracle 管理的临时文件。
  • 如果在初始化参数文件中没有指定 CONTROL_FILES 初始化参数,则数据库也会创建一个 Oracle 管理控制文件。
  • 如果您正在使用服务器参数文件,那么数据库将自动设置适当的初始化参数。

在创建数据库时支持大文件表空间

通过创建大文件表空间,Oracle 数据库简化了表空间的管理,并支持超大数据库。

大文件表空间只能包含一个文件,但该文件最多可以有 4G 块。Oracle 数据库中数据文件的最大数量是有限的(通常是64K文件)。因此,大文件表空间可以显著提高 Oracle 数据库的存储容量。

本节讨论 CREATE DATABAS 语句的子句,这些子句允许包含对大文件表空间的支持。

指定默认表空间类型

CREATE DATABASE 语句的 SET DEFAULT...TABLESPACE 子句决定了该数据库在后续的 CREATE TABLESPACE 语句中的默认表空间类型。

  • 指定 SET DEFAULT BIGFILE TABLESPACESET DEFAULT SMALLFILE TABLESPACE

如果忽略此子句,则默认是一个 小文件表空间,这是传统类型的 Oracle 数据库表空间。一个小文件表空间最多可以包含 1022 个文件,每个文件最多可以包含 4M 块。

大文件表空间的使用进一步增强了 Oracle Managed Files 特性,因为大文件表空间使数据文件对用户完全透明。’ ALTER TABLESPACE 语句的 SQL 语法已被扩展,允许您对表空间而不是底层数据文件执行操作。

创建的数据库的语句所示“Specifying Oracle Managed Files at Database Creation”可以修改如下指定默认的表空间是一个大文件类型表空间:

CREATE DATABASE mynewdb USER SYS IDENTIFIED BY sys_password USER SYSTEM IDENTIFIED BY system_password SET DEFAULT BIGFILE TABLESPACE UNDO TABLESPACE undotbs1 DEFAULT TEMPORARY TABLESPACE tempts1;

要在创建数据库后动态更改默认表空间类型,请使用 ALTER DATABASE 语句的 SET DEFAULT TABLESPACE 子句:

ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;

您可以通过查询 DATABASE_PROPERTIES 数据字典视图来确定数据库当前默认表空间类型,如下所示:

SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TBS_TYPE';

覆盖默认表空间类型

SYSTEMSYSAUX 表空间总是使用默认表空间类型创建的。然而,您可以选择在 CREATE DATABASE 操作期间显式覆盖 UNDODEFAULT TEMPORARY 表空间的默认表空间类型。

  • 指定 UNDO TABLESPACE 子句或 DEFAULT TEMPORARY TABLESPACE 子句,覆盖默认表空间类型。

例如,你可以用默认的小文件表空间类型在数据库中创建一个大文件 UNDO 表空间,如下所示:

CREATE DATABASE mynewdb ... BIGFILE UNDO TABLESPACE undotbs1 DATAFILE '/u01/oracle/oradata/mynewdb/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

你可以用默认的大文件表空间类型在数据库中创建一个小文件 DEFAULT TEMPORARY 表空间,如下所示:

CREATE DATABASE mynewdb SET DEFAULT BIGFILE TABLESPACE ... SMALLFILE DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE '/u01/oracle/oradata/mynewdb/temp01.dbf' SIZE 20M REUSE ...

指定数据库时区和时区文件

Oracle 数据库的 datetime 和 interval 数据类型以及时区支持使得存储关于事件和事务时间的一致信息成为可能。

设置数据库时区

您可以使用 CREATE DATABASE 语句的 SET TIME_ZONE 子句设置数据库时区。

  • 使用 CREATE DATABASE 语句中的 SET TIME_ZONE 子句设置创建数据库时的时区。

如果不设置,则默认为主机操作系统所在的时区。

您可以使用 ALTER SESSION 语句中的 SET TIME_ZONE 子句来更改会话的数据库时区。

关于数据库时区文件

两个时区文件包含在 Oracle Home 目录的子目录中。时区文件包含有效的时区名称。

每个时区还包括以下信息:

  • 与协调世界时(UTC)的偏差

  • 夏令时的转换时间

  • 标准时间和夏令时的缩写

默认时区文件为 ORACLE_HOME/oracore/zoneinfo/timezlrg_11.dat。在ORACLE_HOME/oracore/zoneinfo/timezone_11.dat 中可以找到一个时区更少的时区文件。

要查看数据库使用的文件中的时区名称,使用以下查询:

SELECT * FROM V$TIMEZONE_NAMES;

指定数据库时区文件

所有共享信息的数据库必须使用相同的时区数据文件。

默认情况下,数据库服务器总是使用大的时区文件。

要在客户端使用小时区文件,并知道所有的数据将只引用小文件中的区域:

  • 将客户端上的环境变量 ORA_TZFILE 设置为客户端上时区 version.dat 文件的完整路径名,其中 version 匹配数据库服务器正在使用的时区文件版本。

如果您已经在客户端上使用了默认的较大时区文件,那么更改为较小的时区文件是不现实的,因为数据库中包含的时区数据可能不是较小文件的一部分。

指定 FORCE 日志模式

一些数据定义语言语句(如 CREATE TABLE)允许使用 NOLOGGING 子句,这会导致一些数据库操作在数据库重做日志中不生成重做记录。NOLOGGING 设置可以加速可以在数据库恢复机制之外轻松恢复的操作,但它会对介质恢复和备用数据库产生负面影响。

Oracle 数据库允许你强制写重做记录,即使在 DDL 语句中指定了 NOLOGGING。数据库永远不会为临时表空间和临时段生成重做记录,因此强制日志记录对对象没有影响。

使用 FORCE LOGGING 子句

即使在 DDL 语句中指定了 NOLOGGING,也可以强制写入重做记录。

将数据库设置为 FORCE LOGGING 模式:

  • CREATE DATABASE 语句中包含 FORCE LOGGING 子句。

如果不指定此子句,则数据库不会进入 FORCE LOGGING 模式。

在创建数据库之后,使用 ALTER DATABASE 语句将数据库设置为 FORCE LOGGING 模式。该语句可能需要相当长的时间才能完成,因为它等待所有未记录的直接写操作完成。

您可以使用以下 SQL 语句取消 FORCE LOGGING 模式:

ALTER DATABASE NO FORCE LOGGING;

独立于为数据库指定 FORCE LOGGING,你可以有选择地在表空间级别指定 FORCE LOGGINGNO FORCE LOGGING。然而,如果 FORCE LOGGING 模式对数据库有效,它将优先于表空间设置。如果它对数据库不起作用,则强制执行单个表空间设置。Oracle 建议要么将整个数据库置于 FORCE LOGGING 模式,要么将单个表空间置于 FORCE LOGGING 模式,但不能同时将两者置于 FORCE LOGGING 模式。

FORCE LOGGING 模式是数据库的一个持久属性。也就是说,如果数据库关闭并重新启动,它将保持相同的日志记录模式。但是,如果您重新创建控制文件,数据库不会在 FORCE LOGGING 模式下重启,除非您在 CREATE CONTROL FILE 语句中指定了 FORCE LOGGING 子句。

FORCE LOGGING 模式的性能考虑

FORCE LOGGING 模式会导致性能下降。

如果指定 FORCE LOGGING 的主要原因是确保介质完全恢复,并且没有备用数据库活动,那么考虑以下情况:

  • 可能发生多少介质故障?

  • 如果未记录的直接写无法恢复,损害有多严重?

  • 由强制日志记录引起的性能下降是可以容忍的吗?

如果数据库运行在 NOARCHIVELOG 模式,那么通常将数据库置于 FORCE LOGGING 模式没有好处。在 NOARCHIVELOG 模式下,介质恢复是不可能的,所以如果您将它与 FORCE LOGGING 结合使用,结果可能是性能下降,但收效甚微。

从 Oracle Database 18c 开始,引入了以下两个新的 nologging 子句,可以进行非日志操作,Active Data Guard备数据库接收所有数据,从而防止了 FORCE LOGGING 模式产生大量重做日志导致的性能下降:

  • STANDBY NOLOGGING FOR DATA AVAILABILITY
  • STANDBY NOLOGGING FOR LOAD PERFORMANCE
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论