经过博文部署Oracle 12c企业版数据库已经能够部署Oracle数据库了,本篇博文主要介绍Oracle的体系结构,包括存储结构、内存结构和进程结构进行初步了解。对进一步学习Oracle数据库有很大的帮助。算法
博文大纲:
1、Oracle体系结构
1.Oracle体系结构概述
2.Oracle服务器
3.Oracle存储结构
4.Oracle内存结构
5.Oracle进程结构
2、CDB与PDB的基本操做
3、用户管理
4、数据库权限管理
5、导入测试数据sql
数据库的体系结构是指数据库的组成、工做过程、以及数据库中数据的组织与管理机制,要了解Oracle数据库的体系结构,必须理解Oracle系统的主要组件和重要概念。数据库
Oracle体系结构包含一系列组件,如图:
图中显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其余文件,如参数文件、口令文件和归档日志文件等。vim
从图中能够看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的两个概念。c#
做为一个DBA管理者,维护实例和数据库自己的正常运行是最基本的技能。缓存
Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle实例启动时,将分配一个系统全局区(SGA)并启动一系列Oracle后台进程。安全
Oracle实例有两种类型:服务器
- 单进程Oracle实例使用一个进程执行Oracle的所有操做,在单进程环境下的Oracle实例仅容许一个用户可存取;
- 多进程Oracle实例使用多个进程来执行Oracle的不一样部分,对于每一个链接的用户都有一个进程;
数据库是数据的集合,物理上指存储数据库信息的一组操做系统文件,每一个数据库有一个逻辑结构和物理结构。session
从Oracle 12c版本开始,Oracle引入了可插拔数据库的概念,可插拔是为云计算而生。可插拔的结构由一个容器数据库(CDB)和若干个可组装数据库(PDB)组成,每一个PDB对外可充当一个独立的数据库工应用程序使用,它能够包含本身的数据文件,可是全部的PDB共享CDB的控制文件以及日志文件。所谓的可插拔,意味着PDB能够像USB同样随时插入CDB中,不用了也能够随时拔下来。一个CDB中最多能够插入250个PDB,在PDB中,seedPDB为模板PDB,它为新建立的PDB提供模板,其余的PDB能够根据须要建立、删除。可插拔功能能够加速数据库的部署,给一个CDB打补丁就能够经全部的更新同步到其上的全部PDB中。oracle
在Oracle 12c以前的版本中,实例和数据库只能是一对一或多对一的关系,即只能是一个实例对应一个数据库,或者多个实例对应一个数据库。单子啊Oracle 12c版本中,经过引入CDB和PDB,一个实例能够对应多个可插拔数据库。
可插拔数据库的使用场景:
(1)企业中有多个应用均须要使用Oracle数据库,他们仅使用很是少许的硬件资源,可是又不得不为他们建立多个实例;
(2)一些不是特别重要的数据库,打包须要DBA花费大量的精力去维护;
(3)为了更好的利用硬件资源以及减小管理开销,有必要将大量的部门级应用整合到少数几个Oracle关系型数据库中,以便部署和管理;
经过一个集中化的平台部署多个数据库,同时又共享一个数据库实例,能够大大下降成本,即更少的实例损耗和耕地的存储技术。
若是在生产环境中只须要一个数据库,并不想使用可插拔数据库,能够在安装过程当中取消勾选“建立为容器数据库”复选框,从而将安装一个普通数据库。
Oracle服务器也是很是重要的概念,它主要由实力和数据库文件组成,也就是常说的数据库管理系统(DBMS)。
Oracle服务器的组成如图:
Oracle服务器除了维护实例和数据库文件外,还在用户创建与服务器的链接时启动服务器进程并分配PGA。
Oracle的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系。如图:
物理结构是Oracle数据库建立后使用的操做系统物理文件,Oracle数据库的物理文件分为如下两类:
(1)数据文件:数据文件的扩展名一般是.dbf,是物理存储Oracle数据库数据的文件。
数据文件的特色:
- 每一个数据文件只与一个数据库相联系;
- 一个表空间可包含一个或多个数据文件;
- 一个数据文件只能属于一个表空间;
(2)重作日志文件:重作日志文件的扩展名是.log,它记录了对数据的全部更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其余意外出现后从新恢复数据库。
在Oracle数据库中,重作日志文件是成组使用的,每一个重作日志文件组能够有一个多多个重作日志文件。在工做过程当中,多个重作日志文件组之间循环使用,当一个重作日志文件组写满后,会转向下一个日志文件组。重作日志文件用于记录数据库变化,是用户的事务处理日志。
(3)控制文件:控制文件的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息不少,其中包括数据文件和重作日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当Oracle读写数据时,要根据控制文件 的信息查找数据文件。
因为控制文件的重要性,一个数据库至少要有两份控制文件。Oracle 12c默认包含两个控制文件,各个控制文件内容相同,从而能够避免由于一个控制文件的损坏而致使没法启动数据库的状况发生。
控制文件中记录了如下信息:
- 数据文件的位置及大小;
- 重作日志文件的位置及大小;
- 数据库名称及建立时间;
- 日志序列号;
其余文件有参数文件、归档日志文件、口令文件等。
数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle数据库的逻辑结构包括表空间、段、区、块和模式等。如图:
每一个Oracle数据库都是由若干个表空间构成的,用户在数据库中创建的全部内容都被存储到表空间中。一个表空间能够由多个数据文件,但一个数据文件只能属于一个表空间。与数据文件这种物理结构不一样,表空间属于数据库的逻辑结构。
在每一个数据库中,都有一个名为“SYSTEM”的表空间,即系统表空间,还会有SYSAUX、UNDO、USERS等表空间,这些都是在建立数据库时自动建立的。管理员能够建立自定义的表空间并分配给指定用户,也能够为表空间增长和删除数据文件。
表空间基本有如下三类:
(1)永久性表空间:通常保持基表、试图、过程和索引等的数据。SYSTEM、SYSAUX、USERS表空间是默认安装的;
(2)临时性表空间:只用于保存系统中短时间活动的数据,如排序数据等;
(3)撤销表空间:用来帮助回退未提交的事务数据,已提交的数据在这里是不能够恢复的;
通常不须要建立临时性表空间和撤销表空间,除非要把他们转移到其余磁盘中以提升性能。
表空间的目的以下:
- 对不一样用户分配不一样的表空间,对不一样的模式对象分配不一样的表空间,方便对用户操做和对模式对象的管理;
- 能够将不一样数据文件建立不一样的磁盘中,有利于管理磁盘空间、提升I/O性能、备份和恢复数据等;
通常在完成Oracle系统的安装并建立Oracle实例后,Oracle系统自动啊尽力SYSTEM、SYSAUX、USRS等多个表空间。
下面详细介绍一下这几种表空间:
- SYSTEM表空间:用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户建立的表,索引等对象存放到SYSTEM表空间中;
- SYSAUX表空间:做为SYSTEM的辅助表空间,用于存放各类数据库工具用户的数据;还用于存放各类模式的对象数据,如智能代理用户DBSNMP等,这些模式在数据库安装完成后就创建了相应的对象并都存放在SYSAUX表空间中;
- USERS表空间:一般做为用户使用的表空间,能够在这个表空间上建立各类对象,如表、索引等;
- TEMP表空间:Oracle系统用于存放临时数据的特殊表空间。好比:当操做中须要进行排序时,Oracle系统就将排序的数据临时存放在该表空间内。排序处理完成后便可释放排序数据所占用的空间,所以成为临时表空间;
除了Oracle系统默认建立的表空间外,用户可根据应用系统的模式及其所要存储的对象类型建立多个表空间,以区分用户数据和系统数据。
建立表空间数据数据定义语言,语法以下:
语法中:
内存结构是Oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要素。
Oacle内存存储的主要内容:
照内存使用方式不一样,Oracle数据库的内存也能够分为如下几种:
- SGA:全部用户均可以访问的实例的共享内存区域。数据块、事务处理日志、数据字典信息等都存储在SGA中;
- PGA:一类非共享的内存,专用于特定的服务器进程,而且只可以由这个进程访问;
- UGA:为用户进程存储会话状态的内存区域。根据用户数据库时配置为专用服务器模式,仍是配置为共享服务器模式,UGA能够做为SGA或PGA的一部分。它为用户会话存储数据。
重点介绍一下SGA和PGA:
Oracle实例的SGA同来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时,SGA的内存被自动分配。SAG是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。
SGA按其做用不一样,能够分为如下几个部分:
共享池是对SQL、PL/SQL程序进行语法分析、编译、执行时用到的内存区域。
共享池由库缓存和数据字典缓存组成:
数据缓冲区用于存储从磁盘数据文件中读入的数据,供全部用户共享。修改数据时,首先要从数据文件中取出数据,存储于数据缓冲区中。修改的数据,插入的数据都被存储于数据缓冲区中,修改完成和其余条件知足时,数据才被写入数据文件中。
Oracle服务器进程在处理一个查询时,首先查找内存中是否存在所需的数据块。若是在数据缓冲区中没有找到须要的块,服务器进程就从数据文件中读取此块,并保存在缓冲区中。当后续的请求须要读取这些块时,即可以在内存中找到,所以这些请求不须要从磁盘中读取,从而提升了读取速度。数据缓冲区的大小对数据库的读取速度有直接的影响。
当用户执行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操做时,数据发生了变化,这些变化了的数据在写入数据缓存以前先要写入重作日志缓冲区,同时变化以前的数据也放入重作日志缓存,这样在数据恢复时Oracle就知道哪些资源须要提交,哪些资源须要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较小。
在SGA中,大池是一个可选的缓冲区,管理员能够根据须要对其今进行配置。在大规模输入、输出及备份过程当中也须要大池做为缓冲空间,如大数据操做、数据库备份与恢复之类的操做。
在SGA中,Java池也是一个可选的缓冲区,可是在安装Java或者使用Java程序时必须设置Java池,用于编译Java语言编写的指令。
PGA不是实例的一部分,它包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA是在用户进程链接到数据库并建立一个会话时自动分配的,该分区保留了每一个与Oracle数据库链接的用户进程所需的内存。在一个用户结束会话后,PGA将被释放。
Oracle中有几种不一样类型的进程:
用户进程是一个须要与Oracle服务器进程交互的程序。当数据库用户运行一个应用程序准备向数据库服务器发送请求时,即建立了用户进程。例如:用户启动数据库工具Sqlplus时,系统将自动创建一个用户进程。
服务器进程用于处理链接到实例的用户进程的请求。当用户创建与数据库的链接时,即产生服务器进程。服务器进程和用户进程通讯并为所链接的用户请求服务。服务器进程直接与Oracle数据库交互,实现调用和返回结果的目的。服务器进程及能够处理一个用户进程的请求,也能够处理多个用户进程的请求。
在Oracle数据库中,为了使系统性能更好地协调多个用户,实例系统中使用的一些附加进程,称为后台进程。这些后台进程存在于操做系统中,在实例启动时自动启动。其中有五个进程是必需要启动的,不然数据库实例没法启动。这五个进程分别是:
PMON进程在用户链接意外中断后执行资源清理工做,包括如下任务:
SMON进程执行如下任务:
DBWR进程执行如下任务:
LGWR进程负责将重作日志缓冲区中的日志数据写入日志文件组。数据库在运行时,若是对数据进行修改,则产生日志信息,日志信息首先产生于重作日志缓冲区中。此缓冲器按照“先进先出”的原则进行操做,当日志信息知足必定条件是,由LGWR进程将日志数据写入日志文件。系统一般有多个日志文件,日志写入进程以循环的方式将数据写入文件。
CKPT进程是确保数据缓冲区中全部修改过的数据块都写入数据文件的机制。当检查点完成后,CKPT进程负责更新数据文件头和控制文件、保存检查点信息,以保证数据库日志文件和数据文件同步。在数据库恢复时只须要找到CKPT保存的最后一次检查点,就能够根据它肯定日志文件中恢复数据的开始位置,而后从新执行其以后的日志记录便可。
ARCn进程即归档日志进程,是一个可选进程,只有在打开日志归档时才有该进程。该进程的主要做用是发生日志切换时将写满的联机日志文件复制到归档目录。
与以前版本的Oracle不一样,Oracle 12c能够做为单个数据库使用,也可根据企业须要,提供若干个可插拔PDB数据库。每一个PDB能够由不一样的DBA维护。
下面简单介绍一下CDB与PDB的基本维护:
[oracle@oracle ~]$ sqlplus sys as sysdba //以sys用户登陆数据库 SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:26:41 2019 Copyright (c) 1982, 2016, Oracle. All rights reserved. 输入口令: ****** 已链接到空闲例程。 SQL> startup; //启动数据库 ORACLE 例程已经启动。 Total System Global Area 2466250752 bytes Fixed Size 8795760 bytes Variable Size 671091088 bytes Database Buffers 1778384896 bytes Redo Buffers 7979008 bytes 数据库装载完毕。 数据库已经打开。 SQL> show con_name; //查询当前所在的容器 CON_NAME ------------------------------ CDB$ROOT //表示当前在CDB下 SQL> show pdbs; //查询数据库中的全部容器 CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO //建立PDB数据库模板 3 ORCLPDB MOUNTED //状态为mounted(并无open) SQL> alter pluggable database orclpdb open; //CDB下将可插拔数据库orclpdb打开 //若是没有将PDB打开就已经切换到PDB中,可使用“shutdown immediate”关闭PDB数据库、“startup”启动PDB数据库 插接式数据库已变动。 SQL> alter session set container=orclpdb; //CDB下切换会话到PDB中 会话已更改。 SQL> show con_name; //再次查看当前位置已经位于orclpdb中 CON_NAME ------------------------------ ORCLPDB SQL> alter session set container=cdb$root; //回到CDB数据库 会话已更改。 SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT
以上是从CDB切换到PDB中,反之,同样。
链接到可插拔数据库PDB有两种方法:
第二种是实现方法以下:
[oracle@oracle ~]$ vim /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521)) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ---------------------------------------------------- //分界线,以上不须要进行修改 lzj = //根据上面的模板,进行编写,这个名字能够自定义 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orclpdb) //这里须要指定PDB数据库名称 ) ) [oracle@oracle ~]$ sqlplus sys@lzj as sysdba //登陆数据库时需指定刚才定义的名称 SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:48:50 2019 Copyright (c) 1982, 2016, Oracle. All rights reserved. 输入口令: ****** 链接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> show con_name; //查看进行验证 CON_NAME ------------------------------ ORCLPDB
在建立一个新数据库时,Oracle将建立一些默认数据库用户,好比:SYS、SYSTEM等用户。
简单介绍一下Oracle数据库的用户:
SYS用户是Oracle中的一个超级用户,主要用来维护系统信息和管理实例。数据库中全部数据字典和视图都存储在SYS模式中。数据字典存储了用来管理数据库对象的全部信息,是Oracle数据库中很是重要的系统信息。SYS用户只能以SYSOPER或SYSDBA角色登陆数据库系统。
SYSTEM用户是Oracle中默认的数据库管理员,它拥有DBA权限。该用户模式中存储了Oracle管理工具使用的内部表和视图。一般经过SYSTEM用户管理Oracle数据库的用户、权限和存储等,不建议在SYSTEM模式中建立用户表。SYSTEM用户不能以SYSOPER或SYSDBA角色登陆数据库系统,只能使用默认方式(数据库身份验证的方式)登陆。
Oracle 12c支持建立自定义用户,因为PDB的引入,自定义用户范畴和以前版本有所不一样。在CDB模式下,用户分为两种:公用用户和本地用户。公用用户能够在CDB和PDB中使用,而本地用户只能在PDB中使用。在CDB环境中,不容许建立本地用户。Oracle规定,在CDB中建立公用用户是,用户名必须以c##开头。
一般状况下,出于安全考虑,对于不一样用户的数据表须要不一样的访问权限,所以,就须要建立不一样的用户。Oracle中的CREATE USER命令用于建立新用户。每一个用户都有一个默认空间和一个临时表空间。若是没有指定,Oracle就将USERS设为默认表空间,将TEMP设为临时表空间。
建立用户的语法以下:
在语法中:
SQL> create user c##lzj 2 identified by 123456; //建立用户 用户已建立。 SQL> alter user c##lzj identified by 654321; //修改用户密码 用户已更改。 SQL> drop user c##lzj cascade; //删除用户 用户已删除。 //删除用户时,不带 cascade则表示只删除用户,带上 cascade则表示删除用户即用户模式对象
权限是执行某种类型的SQL语句挥着存取其余用户数据库对象的权利。在Oracle中,权限分为系统权限和对象权限两类。
系统权限是指在数据库中执行某种系统级别的操做,或者针对某一类的对象执行某种操做的权限。如图:
常见的系统权限以下:
一个新用户建立完成后,首选要授予其CREATE SESSION权限,使其能够登陆到数据库。
对象权限是指针对某个特定的模式对象执行操做的权力。如图:
Oracle数据库用户有两种获取权限的途径:①直接向用户授予权限;②将权限授予角色,再将角色授予一个或多个用户。使用角色可以更加方便和高效地对权限进行管理。因此数据库管理员经过使用角色向用户授予权限,而不是直接向用户授予权限。在Oracle数据库系统中预约义了不少角色,其中最经常使用的主要有CONNECT角色、RESOURCE角色、DBA角色等。
Oracle中经常使用的系统预约义角色以下:
新建立的用户必须授予必定的权限才可对数据库进行相关的操做。
SQL> grant connect,resource to c##lzj; 受权成功。 SQL> revoke connect,resource from c##lzj; 撤销成功。
数据库用户安全设计原则以下:
- 数据库用户去哪先按照最小分配原则;
- 数据库用户可分为管理、应用、维护、备份四类用户;
- 不容许使用sys和system用户创建数据库应用对象;
- 禁止对普通用户授予dba权限;
- 对查询用户只能开放查询权限;
- 对新建用户初次登陆数据库时强制修改密码;
通常程序开发人员只要授予 connect和resource两个角色便可。注意:授予这两个角色就包含了授予用户无限制使用默认表空间的权限。
在PDB模式下建立用户lzj,并对其受权,具体操做:
SQL> select name from v$pdbs; //查询全部的可插拔数据库 NAME -------------------------------------------------------------------------------- PDB$SEED ORCLPDB SQL> alter session set container=orclpdb; //切换到可插拔数据库orclpdb 会话已更改。 SQL> show con_name; //查询当前所在的数据库容器 CON_NAME ------------------------------ ORCLPDB SQL> create user lzj identified by 123456; //在PDB建立用户(不须要添加c##) 用户已建立。 SQL> alter user lzj identified by 654321; //修改用户密码: 用户已更改。 SQL> grant connect to lzj; //对用户进行受权 受权成功。 SQL> alter session set container=cdb$root; //切换到CDB容器 会话已更改。 SQL> show con_name; //查看当前的容器 CON_NAME ------------------------------ CDB$ROOT
在Oracle 12c之前的版本中,安装完成以后默认会scott用户,该用户模式下存放了用于测试的表,而Oracle 12c安装完成以后默认没有scott用户。为了之后测试方便,下面介绍如何在Oracle 12c中导入测试数据的方法。
下载test.sql脚本,而后执行如下操做:
[oracle@oracle ~]$ ll //准备脚本测试文件 总用量 8 -rw-r--r-- 1 oracle oinstall 7658 6月 15 2017 test.sql [oracle@oracle ~]$ sqlplus / as sysdba SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 17:19:15 2019 Copyright (c) 1982, 2016, Oracle. All rights reserved. 链接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> create user c##scott identified by scott default tablespace users temporary tablespace temp quota unlimited on users; //建立用户c##scott 用户已建立。 SQL> grant connect,resource to c##scott; //用户受权 受权成功。 SQL> @test.sql //导入脚本文件,不带路径表示当前目录下 ………………………… //建立过程省略 SQL> conn c##scott/scott; //切换用户c##scott 已链接。 SQL> show user; //查看当前用户 USER 为 "C##SCOTT" SQL> col tname for a10; //格式化输出,让一行中显示全部的列,调整tname列的宽度为10 SQL> select * from tab; //查询当前用户下的全部的表 TNAME TABTYPE CLUSTERID ---------- --------------------- ---------- BONUS TABLE DEPT TABLE EMP TABLE SALGRADE TABLE SQL> desc emp; //查询emp表的结构 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) SQL> col empno for 9999; //格式化输出,empno列为数字,9999表明宽度为4 SQL> select * from emp; //根据实际状况,自行修改,怎么好看怎么来 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ----- ----- ---------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALES 7698 20-2月 -81 1600 300 30 MAN 7521 WARD SALES 7698 22-2月 -81 1250 500 30 MAN 7566 JONES MANAG 7839 02-4月 -81 2975 20 ER 7654 MARTI SALES 7698 28-9月 -81 1250 1400 30 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ----- ----- ---------- ---------- ---------- ---------- ---------- N MAN 7698 BLAKE MANAG 7839 01-5月 -81 2850 30 ER 7782 CLARK MANAG 7839 09-6月 -81 2450 10 ER 7788 SCOTT ANALY 7566 19-4月 -87 3000 20 ST EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ----- ----- ---------- ---------- ---------- ---------- ---------- 7839 KING PRESI 17-11月-81 5000 10 DENT 7844 TURNE SALES 7698 08-9月 -81 1500 0 30 R MAN 7876 ADAMS CLERK 7788 23-5月 -87 1100 20 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD ANALY 7566 03-12月-81 3000 20 ST EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ----- ----- ---------- ---------- ---------- ---------- ---------- 7934 MILLE CLERK 7782 23-1月 -82 1300 10 R 已选择 14 行。 SQL> select * from c##scott.emp; //若是使用的是非c##scott用户,须要指定用户.表名
———————— 本文至此结束,感谢阅读 ————————