Espacio de tabla detallado de Oracle (espacio de tabla)

1. Información general

Dibuje el modelo de almacenamiento de Oracle en forma de diagrama entidad-relación, con la estructura lógica a la izquierda y la estructura física a la derecha.
Inserte la descripción de la imagen aquí

  • Hay una relación dibujada con una línea de puntos, que indica una relación de varios a varios entre el segmento y el archivo de datos. La línea discontinua se usa para indicar la relación porque la relación no debería existir. Un buen ingeniero de relaciones no debe permitir relaciones de muchos a muchos.
  • La entidad de espacio de tabla elimina la relación de varios a varios entre el segmento y el archivo de datos. Un espacio de tabla puede contener varios segmentos y puede estar compuesto por varios archivos de datos.

insinuación:

Creando tabley indexcuando debemos traer属主(对应用户的表空间)

2 gramática

2.1 Crear

  • El creador del espacio de tabla debe tener create tablespaceprivilegios del sistema
  • Al crear un espacio de tabla, hay muchas cláusulas predeterminadas / opcionales, siempre que conozcamos las cláusulas más utilizadas.
  • Para obtener uno muy completo, consulte: Oracle 12.2 Official Document-create tablespace

Sintaxis común: donde [] significa que el parámetro es opcional

create [temporary | undo] tablespace "tbs"
datafile 'D:\oracle\tbs_01.dbf'
size 100m
[loggin | nologgin] -- 默认 loggin
[autoextend off] | [autoextend on next n1 maxsize m] -- 自动扩展, 默认 off, n1 默认 , m 默认 unlimited <= size n
[extent management local [uniform size n]] -- 默认 local, n = 64K;
[segment space management auto] -- 默认 auto, 且不建议被修改

-- 创建新用户,使用该表空间,方便测试
create user ODSDATA identified by 12345 default tablespace tbs
temporary tablespace temp quota unlimited on odstbs;
grant create session to ODSDATA;
grant resource to ODSDATA;

Análisis de sintaxis:

1. create tablespace tbs 创建一个名为 "tbs" 的表空间(最常用)
	(1) temporary: 临时表空间,用于临时数据的存放
	(2) undo: 撤销表空间,用于重做日志文件的存放

2. datafile 'D:\oracle\tbs_01.dbf' size 5m 指定数据文件的位置和大小
	(1) 数据文件位置: "D:\oracle\tbs_01.dbf" -- 推荐使用绝对路径
	(2) 数据文件大小: 5m
	(3) 如果有多个文件,可以用逗号 , 隔开. 但是每个每个文件都要指明大小
		
3. loggin | nologgin 默认是 loggin,一般不写,但你要知道
	(1) loggin: 创建表空间时,同时生成重做日志文件(数据丢失时,可以恢复)
	(2) nologgin: 与 loggin 相反,但表创建速度快

4. autoextend 表空间是否自动扩展
	(1) off: 不自动扩展,默认值
	(2) autoextend on next 10m maxsize 100m
		自动扩展,增量是 10m,最大大小是 100m
		
5. extent management local | dictionary 区管理
	(1) local 本地管理,强烈推荐,从 Oracle 9i 开始,只能用 local,效率高
	(2) dictionary 数据字典管理,以前的管理方式。
		将数据文件中的每一个存储单元做为一条记录,在大量数据管理时,会产生大量的 insertupdate 操作,严重影响性能。
		同时,长时间对表数据的操作,会产生很多磁盘碎片,这就是为什么要做磁盘整理的原因。

6. uniform size n: 指定 extent 的固定大小
    (1) size 8m: 固定为 8m
    (2) 若不填,extent 默认 64k (参考: dba_tablespaces 中的 initial_extent)

7. segment space management auto | manual
	(1) auto: 段空间由系统自动管理,只能使用在本地管理的表空间中(lob 字段的表除外)
	(2) manual: 段空间手动管理,目前已不用,主要是为了向后兼容

Después de haberlo creado, también podemos consultar los parámetros establecidos anteriormente a través del diccionario de datos:

SELECT ddf.file_id,
       ddf.file_name, -- 数据文件名称 datefile 'fileName'
       dt.tablespace_name, -- 表空间名称 tablespace tbs
       ddf.bytes / 1024 / 1024 || 'm' size_n, -- 初始数据文件大小,也就是 size n
       dt.logging, -- 日志属性 loggin
       ddf.autoextensible, -- 自动扩展
       dt.extent_management, -- extent management local | dictionary
       dt.allocation_type, -- system 长度自适应 | uniform 长度固定
       dt.segment_space_management, -- segment space management auto | manual
       dt.next_extent / 1024 / 1024 || 'm' next_n -- 数据文件增量大小,也就是 next n (当 allocata_type = 'uniform' 时,才有值)
  FROM dba_tablespaces dt, -- tablespace_name
       dba_data_files  ddf -- file_name, file_id, tablespace_name 
 WHERE ddf.tablespace_name = dt.tablespace_name
   AND dt.tablespace_name IN ('');

2.2 Modificación

  • No se permite modificar el espacio de tabla integrado del sistema, como por ejemplo:system、sysaux、temp、undo、users
  • El archivo de datos, la ubicación y el tamaño correspondientes no han cambiado después de modificar el nombre del espacio de tablas
  • Un espacio de tabla que está fuera de línea no puede modificar su nombre
1. 调整数据文件的大小
alter database datafile 'D:\oracle\tbs01_1.dbf' resize 10m;

2. 调整数据文件为自动扩展
alter database datafile 'D:\oracle\tbs01_1.dbf' autoextend on next 20m maxsize 1g; -- 增量 20m, 最大长度 1g

3. 新增数据文件
alter database datafile 'D:\oracle\tbs02_1.dbf' size 2000m; -- 不自动扩展
alter database datafile 'D:\oracle\tbs02_1.dbf' autoextend on next 20m maxsize 1g; -- 自动扩展

2.3 Eliminar

  • Se puede eliminar cualquier espacio de tabla de la base de datos Oracle (excepto system、sysaux、temp、undo、users)
  • Una vez que se elimina el espacio de tabla, no se puede restaurar, por lo que es mejor hacer una copia de seguridad antes de eliminar el espacio de tabla
  • No puede eliminar un espacio de tabla que contenga segmentos activos, y debe hacer que el espacio de tabla esté fuera de línea antes de ser eliminado (muy simple, no se desconecte ni cierre el PL / SQL en ejecución, eliminar el espacio de tabla informará un error)
  • El usuario para eliminar el espacio de tabla debe tener drop tablespacepermiso
1. 删除空的表空间(数据文件还在)
drop tablespace tbs;

2. 删除表空间 和 数据文件
drop tablespace tbs including contents and datafiles;

3. 仅从数据字典中删除表空间信息,但数据文件仍然存在,但已经失去作用
drop tablespace tbs including contents;

2.4 Consulta

Consultar información sobre el espacio de la tabla: (si hay varios archivos de datos, se requiere la suma de grupos)

SELECT ddf.file_id 文件id,
       ddf.file_name 文件名,
       dt.tablespace_name 表空间名,
       dfs.block_id 块id,
       dt.contents 表空间类型,
       dt.extent_management 表空间管理模式,
       dt.segment_space_management 块空间管理模式,
       dt.allocation_type 分配类型, -- "system 系统随机" or "uniform 固定"
       dt.logging 日志模式,
       dt.force_logging 是否强制日志, -- 优先级 > 日志模式
       ddf.autoextensible 是否自动扩展,
       ddf.bytes / 1024 / 1024 "表空间初始大小(M)", -- 单位由 字节 -> MB
       ddf.maxbytes / 1024 / 1024 "表空间最大扩展到多少(M)", -- 0 表示自动扩展: off
       ddf.bytes / 1024 / 1024 "总大小(M)",
       dfs.bytes / 1024 / 1024 "剩余大小(M)",
       (1 - dfs.bytes / ddf.bytes) * 100 "使用率%"
  FROM dba_tablespaces dt, -- tablespace_name 
       dba_data_files  ddf, -- file_name, file_id, tablespace_name 
       dba_free_space  dfs -- tablespace_name, file_id, block_id 
 WHERE ddf.tablespace_name = dt.tablespace_name
   AND dfs.tablespace_name = ddf.tablespace_name
   AND dfs.file_id = ddf.file_id
   AND ddf.tablespace_name IN ('表空间名');

3 ejemplo

3.1 Crear un espacio de tabla de extensión automática

Cree un archivo de base de datos de 100M student.dbf espacio de tabla permanente tbs_student, expanda automáticamente cada 10M, el máximo es 500M

CREATE TABLESPACE tbs_student 
DATAFILE 'D:\table_space\student.dbf'
SIZE 100m
AUTOEXTEND ON NEXT 10M MAXSIZE 500M -- 自动扩展, 每次扩展 10M, 最大扩展到 500M
PERMANENT -- 永久表空间,默认
EXTENT MANAGEMENT LOCAL;

Consulte el espacio de tabla a través del diccionario de datos:

SELECT dt.tablespace_name 表空间名,
       dt.contents 表空间类型,
       dt.extent_management 表空间管理模式, -- "LOCAL 默认,本地" or "DICTIONARY 数据字典"
       dt.segment_space_management 段空间管理模式, -- "AUTO 默认,自动管理" or "MANUAL 手动管理"
       dt.logging 默认日志属性, -- "LOGGING 默认" OR "NOLOGGING"
       dt.allocation_type 分配类型, -- "SYSTEM 系统自动分配" or "UNIFORM 统一分配"
       dt.next_extent 默认增量, -- next, 当 allocation_type = UNIFORM 时,才有值
       ddf.file_id 文件id,
       ddf.file_name 文件名,
       ddf.autoextensible 是否自动扩展,
       ddf.bytes / 1024 / 1024 "表空间初始大小 M", --,单位
       ddf.maxbytes / 1024 / 1024 "表空间最大扩展到多少 M"
  FROM dba_tablespaces dt, -- tablespace_name
       dba_data_files  ddf -- file_id  
 WHERE ddf.tablespace_name = dt.tablespace_name
   AND ddf.tablespace_name = 'TBS_STUDENT';

resultado de búsqueda:
Inserte la descripción de la imagen aquí

3.2 La tabla no se puede expandir en el espacio de la tabla

la razón:

  • ¡El espacio de la mesa está lleno!
    • La expansión automática del espacio de tabla no está configurada
    • O establezca la expansión automática del espacio de tabla, pero excedió MAXSIZE

Prueba de preparación del usuario

-- 表空间创建语句
CREATE TABLESPACE "TESTTBS_02" DATAFILE 
'D:\TABLE_SPACE\TESTTBS_02.DBF' SIZE 1m
AUTOEXTEND ON NEXT 1m MAXSIZE 2m
EXTENT MANAGEMENT LOCAL 
SEGMENT SPACE MANAGEMENT AUTO;

-- 测试用户
CREATE USER test_tablespace IDENTIFIED BY 12345 DEFAULT TABLESPACE TESTTBS_02;
GRANT CREATE SESSION TO test_tablespace; -- 允许登录
GRANT RESOURCE TO test_tablespace; -- 不对用户表空间进行限制

Declaración de prueba:

CREATE TABLE test_tablespace.stu_info (
  ID   NUMBER(10),
  NAME VARCHAR2(30)
);
DECLARE
   v_sql_insert VARCHAR2(500);
BEGIN
   -- 模拟插入语句
   v_sql_insert := 'INSERT INTO test_tablespace.stu_info (id, NAME) VALUES (:b1, :b2)';

   FOR i IN 1 .. 100000 LOOP
      EXECUTE IMMEDIATE v_sql_insert
         USING i, 'a' || i;
   END LOOP;
END;

Captura de pantalla de error:
Inserte la descripción de la imagen aquí

4 extensión

Oración de referencia:

1. 修改表空间名
ALTER TABLESPACE old_name RENAME TO new_name;

2. 设置数据库的默认表空间
ALTER DATABASE DEFAULT TABLESPACE mytbs;

3. 设置数据库的默认临时表空间
ALTER DATABASE TEMPORARY TABLESPACE temptbs;

4. 查询数据库的默认表空间
SELECT t.username, t.default_tablespace, t.temporary_tablespace FROM dba_users t;

5. 允许数据文件自动扩展
ALTER DATABASE DATAFILE 'D:\oracle\tbs01_1.dbf' AUTOEXTEND ON NEXT 10m MAXSIZE 100m;

6. 使用表空间脱机/联机 (有效/无效)
ALTER TABLESPACE tbs01 ONLINE; -- 联机、有效
ALTER TABLESPACE tbs01 OFFLINE; -- 脱机、无效

7. 使表空间只读(仍可执行 drop 删除对象操作)
ALTER TABLESPACE tbs01 READ ONLY;

8. 使表空间可读写(脱机状态的表空间不能修改为读写状态)
ALTER TABLESPACE tbs01 READ WRITE;

4.1 Preguntas frecuentes

1. Se expande automáticamente, ¿por qué indica que no hay suficiente espacio?

AUTOEXTEND ON NEXT 1m MAXSIZE 2m

2. ¿Cuál es el siguiente valor predeterminado de autoextender activado?

  • Cuando el allocation_type = SYSTEMtiempo, el siguiente valor unificado asignado por el sistema, no es fijo
  • Cuando el allocation_type = UNIFORMtiempo, el siguiente valor es fijo, el siguiente
extent management local uniform size 8m -- next = 8m

4.2 Puntos de conocimiento relacionados

Supongo que te gusta

Origin blog.csdn.net/qq_34745941/article/details/91039626
Recomendado
Clasificación