SQL Server 地理数据库中的日志文件表配置选项
有四个不同的 ArcSDE 日志文件选项:共享的日志文件、基于会话的日志文件、独立的日志文件,以及由基于会话的或独立的日志文件组成的池。在本主题中,分别对每个选项进行了描述。
在大多数情况下,数据库管理系统 (DBMS) 的默认 ArcSDE 日志文件表配置应足以满足需要,并且使用推荐的设置。
对于 SQL Server,默认日志文件配置是在临时数据库 (tempdb) 中创建的基于会话的日志文件。
可使用 SDE_server_config 和 SDE_dbtune 表中的特定参数对日志文件选项进行设置。
这些表中的参数分别通过 sdeconfig 和 sdedbtune 命令进行更改。这些命令和其他 ArcSDE 管理命令行工具必须通过 ArcSDE 应用程序服务器从 Esri 客户关怀中心门户下载。随 ArcSDE 应用程序服务器安装提供的《ArcSDE 管理命令参考》中提供了如何使用这些命令的语法和示例。
基于会话的日志文件
基于会话的日志文件数据表专用于单个会话,并可能含有多个选择集(日志文件)。所登录的每个会话都需要一组表以供选择。
何时使用基于会话的日志文件
如果地理数据库存储在 SQL Server 中,则您一定想要使用该日志文件。在 SQL Server 预置数据库中,可在 tempdb 数据库中创建基于会话的日志文件,这意味着在地理数据库中没有可供管理的表,只有极少的事务记录,且在数据库中不必向所有用户授予 CREATE TABLE 权限。由于这是 SQL Server 预置数据库中的默认设置,所以无需更改设置即可使用此日志文件选项。
您何时可能不想使用基于会话的日志文件
在使用 ArcSDE for SQL Server(预置数据库)时,没有理由不使用在 tempdb 中创建的基于会话的日志文件。
为基于会话的日志文件创建的表
根据 SQL Server 中的默认设置,将在 tempdb 中以 ##SDE_SESSION<SDE_ID >_<DBID> 格式创建一个表。<SDE_ID> 是来自 SDE_process_information 表的唯一会话 ID。<dbid> 是来自 SQL Server 的数据库 ID。当连接中的应用程序删除其日志文件时,此表将被截断;当会话断开连接时,此表将被丢弃。请注意,您无法在 Management Studio 的“对象资源管理器”中查看到临时对象。
如果在地理数据库(而非 tempdb)中直接创建基于会话的日志文件表,则会创建以下三个表:SDE_LOGFILES、SDE_LOGFILE_DATA 和 SDE_SESSION<SDE_ID>。事实上,SDE_LOGFILE_DATA 不在这种情况下使用,但会自动创建出来。SDE_LOGFILES 表存储选择集的相关信息以及附加到 SDE_SESSION 表名称的会话标签 <SDE_ID>。SDE_SESSION 表存储所选集的要素标识符,以及日志文件的 ID。
SDE_LOGFILES 和 SDE_LOGFILE_DATA 表保留在地理数据库中。当连接中的应用程序断开连接时,SDE_LOGFILES 表将被截断。当连接中的应用程序删除日志文件时,SDE_SESSION<SDE_ID> 表将被截断;会话断开连接时,此表将被删除。
使用基于会话的日志文件(非池化)所需的设置
在 sde_server_config 表中,要创建所有者不是 ArcSDE 管理员的基于会话的日志文件表,需要进行以下设置:
- ALLOWSESSIONLOGFILE = TRUE
- MAXSTANDALONELOGS = 0
- LOGFILEPOOLSIZE = 0
控制基于会话的日志文件表和索引的存储所需的设置
sde_dbtune 表的 LOGFILE_DEFAULTS 关键字下的许多参数控制着在数据库中存储日志文件表的方式和位置。不设置这些参数也可使用基于会话的日志文件,但如果要更改 SDE_LOGFILES、SDE_LOGFILE_DATA 和 SDE_SESSION 表和索引在数据库中的存储方式,则可对这些参数进行设置。
对于 SQL Server,使用以下参数:
- LD_INDEX_ALL
- LD_STORAGE
- LF_CLUSTER_ID
- LF_CLUSTER_NAME
- LF_INDEX_ID
- LF_INDEX_NAME
- LF_STORAGE
- SESSION_TEMP_TABLE
SESSION_TEMP_TABLE 参数必须设置为 1 (true) 才能允许在 tempdb 中创建基于会话的日志文件表。
如果将 SESSION_TEMP_TABLE 参数更改为 0 (false),则会在连接用户的方案中创建 SDE_LOGFILES、SDE_LOGFILE_DATA 和 SDE_SESSION<SDE_ID> 表。这将对用户所需的权限产生影响。
有关这些参数的说明,请参阅 SQL Server DBTUNE 配置参数。
使用基于会话的日志文件所需的用户权限
如果您使用推荐的预置数据库 SQL Server 设置,则用户仅需要连接到数据库的能力。但如果将 SDE_dbtune SESSION_TEMP_TABLE 参数更改为 0,连接用户在数据库中除需要 CONNECT 权限外还需要 CREATE TABLE 权限。
默认情况下,会授予所有用户 CONNECT 权限;因此如果已从 PUBLIC 中撤消此权限,仅需显式授予该权限即可。
共享日志文件
共享日志文件将由以相同用户身份连接的所有会话所共用。如果有多个用户与同一个用户帐户连接,则所有这些会话均会将记录插入同一日志文件数据表或者从同一日志文件数据表中删除记录。
何时使用共享日志文件
您只有在以下情况下才会使用共享日志文件:您不想在 tempdb 中创建表,并且您有大量并发会话且每个会话都使用单独的 DBMS 用户帐户进行连接。
可能不想使用共享日志文件的情况
如果将地理数据库存储在 SQL Server 中,最好使用在 tempdb 中所创建的基于会话的日志文件,即 ArcSDE for SQL Server 的默认设置。
为共享日志文件创建的表
用于该选项的日志文件表是 SDE_LOGFILES 和 SDE_LOGFILE_DATA。这些日志文件表在用户首次做出超出选择阈值的选择时在连接用户的方案中创建。对于 ArcGIS for Desktop,这个阈值是 100 个记录。
SDE_LOGFILES 存储所创建的每个选择集(日志文件)的相关信息。此表中的 logfile_name 列和 logfile_id 列唯一地标识了日志文件的名称,而 logfile_id 列则将日志文件记录链接到 SDE_LOGFILE_DATA 表。SDE_LOGFILE_DATA 表包含所选记录的 logfile_data_id 和要素标识符。
选择集被清除后,会立即删除所有记录,以防止 SDE_LOGFILE_DATA 表变得过大。SDE_LOGFILES 表将在用户的会话结束时被截断。SDE_LOGFILE_DATA 和 SDE_LOGFILES 将保留在用户的方案中。
使用共享日志文件的设置
在 SERVER_CONFIG 表中,需要进行下列设置来创建共享日志文件表:
- MAXSTANDALONELOGS = 0
- ALLOWSESSIONLOGFILE = FALSE
- LOGFILEPOOLSIZE = 0
控制共享日志文件表和索引的存储所需的设置
对于 SQL Server,使用以下参数:
- LD_INDEX_ALL
- LD_STORAGE
- LF_CLUSTER_ID
- LF_CLUSTER_NAME
- LF_INDEX_ID
- LF_INDEX_NAME
- LF_STORAGE
有关详细信息,请参阅 SQL Server DBTUNE 配置参数。
使用共享日志文件所需的用户权限
由于日志文件表由连接的用户所有,因此用户必须具有创建所需数据对象(如,表)的权限。即使用户具有地理数据库的只读访问权限或 ArcSDE 设置为只读,也同样要求这一点。如果未向用户授予这些权限,则当该用户首次创建大于特定客户端应用程序阈值大小的选择集时,将收到错误消息。不过在为用户创建 SDE_LOGFILES 和 SDE_LOGFILE_DATA 表后,地理数据库管理员可以撤消这些权限。
例如:Ian 是一位城市规划者,他通常只从地理数据库中选择数据,进行一些与其工作相关的分析。因此,他被视为只读用户。但是,如果 Ian 要在该城市的 ArcSDE 地理数据库中创建 SDE_LOGFILES 和 SDE_LOGFILE_DATA 表,则需要拥有在地理数据库中创建表的权限。
不过地理数据库管理员不会授予 Ian 无期限创建表的权限,而是决定以 Ian 的身份登录到地理数据库,做出超出选择阈值的选择,然后撤消 Ian 创建表的权限。
使用 SQL Server 中的共享日志文件表需要具有以下权限:
- CONNECT
- CREATE TABLE
默认情况下,会授予所有用户 CONNECT 权限;因此如果已从 PUBLIC 中撤消此权限,仅需显式授予该权限即可。
独立日志文件
独立日志文件由会话为应用程序需要存储的每个选择集创建。
在所有日志文件选项中,独立日志文件可生成的表最多。请牢记,需要配置足够的空间来存储所有这些日志文件表。DBTUNE 参数 SESSION_STORAGE 和 SESSION_INDEX 可为大多数 DBMS 中的独立日志文件的表和索引分配空间。
何时使用独立的日志文件
如果您不需要向所有数据库用户均授予在地理数据库中创建表的权限,那么您可以使用独立的日志文件表。
独立的日志文件表的一个优点是:清除选择集时,存储该选择的 SDE_LOGDATA 表将被截断而不是被删除。截断操作的执行速度要快于删除操作,这是因为前者无需发出内部结构化查询语言 (SQL) 语句。不过,还没有太多实例可以说明这种性能提升的价值高于为每个图层创建并存储单个日志文件表的成本。
何时不使用独立的日志文件
如果存在连接到数据库的只读用户,则不能使用独立的日志文件。中断连接时,SDE_LOGDATA<SDE_ID> 表将从用户的方案中删除。每次超过某个图层的选择阈值时,都必须重新创建它们。因此,如果用户将要连接到地理数据库,您不能移除这些用户的 CREATE 权限。
为独立的日志文件创建的表
对于会话创建的超出选择阈值的每个选择集,将为每个图层创建一个新的 SDE_LOGDATA<SDE_ID> 表。这么做可以消除对 SDE_LOGDATA 表的争用。不过,由于为每个选择集都会创建新表并且新表将在会话断开时删除,因此会生成大量的 CREATE TABLE 和 DROP TABLE SQL 语句。
对于每个连接,都将在用户的方案中创建 SDE_LOGFILES 和 SDE_LOGFILE_DATA 表。SDE_LOGFILES 表用于存储选择集属性,但不使用 SDE_LOGFILE_DATA 表。
当图层不再需要选择集时,SDE_LOGDATA<SDE_ID> 表将被截断。当会话断开时,将删除 SDE_LOGDATA<SDE_ID> 表。即使用户断开连接以后,SDE_LOGFILES 和 SDE_LOGFILE_DATA 表仍然保留在用户的方案中;不过,SDE_LOGFILES 表将被截断。
使用独立日志文件(非池化)所需的设置
sde_server_config 表中用于指定可创建独立日志文件数的参数是 MAXSTANDALONELOGS。MAXSTANDALONELOGS 的默认设置为 0,因此,如果要使用独立日志文件,必须将 MAXSTANDALONELOGS 数值设置为允许每个用户创建的独立日志文件数。
要创建所有者不是地理数据库管理员的独立日志文件表,需要进行以下设置:
- MAXSTANDALONELOGS = <任何用户都可创建的 SDE_LOGDATA<SDE_ID> 表的最大数量>
- LOGFILEPOOLSIZE = 0
在会话的配额(由 MAXSTANDALONELOGS 服务器配置参数定义)用完以前,将一直使用独立的日志文件。当用户用完独立的日志文件时,换言之,当应用程序需要同时创建的选择集(日志文件)数量超出 MAXSTANDALONELOGS 允许的值时,ArcSDE 将尝试创建基于会话的日志文件,但前提是将 ALLOWSESSIONLOGFILE 设为 TRUE。如果 ArcSDE 无法创建基于会话的日志文件,则将尝试创建共享日志文件。如果共享日志文件也无法创建并且独立的日志文件也已用完,那么 ArcSDE 将返回错误。
有关日志文件类型使用顺序的示例的信息,请参阅 ArcSDE 日志文件按照何种顺序使用?
控制独立日志文件表和索引的存储所需的设置
sde_dbtune 表的 LOGFILE_DEFAULTS 关键字下的许多参数控制着在数据库中存储日志文件表的方式和位置。不设置这些参数也可使用独立日志文件,但如果要更改 SDE_LOGFILES、SDE_LOGFILE_DATA 和 SDE_LOGDATA 表和索引在数据库中的存储方式,则可对这些参数进行设置。
对于 SQL Server,使用以下参数:
- LD_INDEX_ALL
- LD_STORAGE
- LF_CLUSTER_ID
- LF_CLUSTER_NAME
- LF_INDEX_ID
- LF_INDEX_NAME
- LF_STORAGE
- SESSION_TEMP_TABLE
SESSION_TEMP_TABLE 参数必须设置为 1 (true) 才能允许在 tempdb 中创建独立日志文件表。
如果将 SESSION_TEMP_TABLE 参数更改为 0 (false),则会在连接用户的方案中创建 SDE_LOGFILES、SDE_LOGFILE_DATA 和 SDE_SESSION<SDE_ID> 表。这将对用户所需的权限产生影响。
有关这些参数的说明,请参阅 SQL Server DBTUNE 配置参数。
使用独立日志文件所需的用户权限
使用独立的日志文件表的用户帐户必须拥有创建所需数据库对象的权限。与共享日志文件不同的是,日志文件表创建完以后,您无法撤消用户的权限,这是因为每次会话创建一个足够大的选择时,每个图层都将创建一个新的用户所有的表。
如果将 SESSION_TEMP_TABLE 设置为 1,SQL Server 用户仅需要数据库的 CONNECT 权限。但如果将 SDE_dbtune SESSION_TEMP_TABLE 参数更改为 0,连接用户在数据库中除需要 CONNECT 权限外还需要 CREATE TABLE 权限。
默认情况下,会授予所有用户 CONNECT 权限;因此如果已从 PUBLIC 中撤消此权限,仅需显式授予该权限即可。
由 ArcSDE 管理员所有的日志文件池
地理数据库管理员可以创建可由其他用户检出和使用的日志文件池。这些日志文件可以是基于会话的日志文件,也可以是独立的日志文件。共享的日志文件不能从 ArcSDE 日志文件池中检出。
使用 ArcSDE 日志文件池可以避免向用户授予在数据库中创建对象所需的权限。
何时使用地理数据库管理员所有的日志文件池
如果无法向用户授予他们在自己的方案中创建日志文件表的权限,则可以使用日志文件池。尽管如此,用户依然需要拥有创建会话或连接到数据库的权限。
在池内使用基于会话的日志文件可以更高效地使用池资源,这是因为基于会话的日志文件可以将多个选择集写入单个表中;而独立的日志文件则需要针对每个具备条件的选择集使用一个表。
何时不使用地理数据库管理员所有的日志文件池
一般来说,使用日志文件池需要的维护略多一些,这是因为您必须估计所需日志文件表的数量,而且还需要调整池的大小或已使用的池的数量。请切记,日志文件池过大或过多可能会对性能产生不良影响。
为由 ArcSDE 管理员所有的日志文件池创建的表
为 sde_server_config 表中的 LOGFILEPOOLSIZE 参数设置的值决定着在 ArcSDE 管理用户的方案中创建的 SDE_LOGPOOL_<table_ID> 表数。例如,如果将 LOGFILEPOOLSIZE 设置为 5,则将在 ArcSDE 管理员的方案中创建以下表:
- SDE_LOGPOOL_1
- SDE_LOGPOOL_2
- SDE_LOGPOOL_3
- SDE_LOGPOOL_4
- SDE_LOGPOOL_5
地理数据库管理员的方案中还有一个表 SDE_LOGFILE_POOL,该表记录了 ArcSDE 会话的 SDE_ID 和表 ID。SDE_LOGPOOL 表名称中的 <table_ID> 对应于 SDE_LOGFILE_POOL 表的 table_ID 列中的值。
如果您使用的是基于会话的日志文件池,那么所创建的选择超出选择阈值的每个会话都会将一个记录添加到 SDE_LOGFILE_POOL 表,会话也将分配给其中一个 SDE_LOGPOOL_<table_ID> 表。如果额外的日志文件由同一会话创建(例如,ArcMap 会话创建了一个具有 300 个记录的另一个选择集),则新的日志文件(选择集)将添加到同一个 SDE_LOGPOOL 表。
清除日志文件时,检出到会话的 SDE_LOGPOOL 表将被截断。例如,如果 ArcMap 会话中的第二个选择集被清除,则这 300 个记录也将从 SDE_LOGPOOL 表中移除,但是第一个选择集的记录仍将保留。清除第一个选择集时,这些记录将从 SDE_LOGPOOL 表中移除。
如果您使用的是独立的日志文件池,那么每个日志文件(具有所需大小的选择集)都将在 SDE_LOGFILE_POOL 表中创建一个新记录,并使用其中一个 SDE_LOGPOOL 表。例如,如果在一个 ArcMap 会话中,您从存储有企业信息的要素类中选择了 (1),其中所有企业都得到了供应食品的许可,并从存储有雨水道信息的要素类中选择了 (2),其中所有集水池都位于供应食品的某家企业一公里的范围内,那么将有两个记录添加到 SDE_LOGFILE_POOL 表:一个对应于企业的选择集,另一个对应于集水池的选择集。每个选择集都将分配有自己的 SDE_LOGPOOL 表。
日志文件(选择集)清除时,对应的 SDE_LOGPOOL 表也将被截断。
使用由 ArcSDE 管理员所有的日志文件池所需的设置
sde_server_config 表中专门影响日志文件池的设置是 LOGFILEPOOLSIZE 和 HOLDLOGPOOLTABLES。
正如前面部分提到的那样,要创建日志文件池,请将配置参数 LOGFILEPOOLSIZE 设为您确定需要创建的日志文件的数量(换言之,SDE_LOGPOOL 表的数量)。除了独立的日志文件以外,这个数字应该反映出要连接到服务器的会话数量(如允许)。
要计算日志文件的总数,应该对日志文件池做出设置,请使用下列公式:
- 如果允许使用会话日志文件,但不允许使用独立的日志文件
LOGFILEPOOLSIZE = 预期的会话总数
例如,如果 MAXSTANDALONELOGS 设置为 0,ALLOWSESSIONLOGFILE 设置为 TRUE,并且预计在任何时候与地理数据库的连接数都不会超过 30,则将 LOGFILEPOOLSIZE 设置为 30。
- 如果允许使用独立的日志文件,但不允许使用会话日志文件
LOGFILEPOOLSIZE = MAXSTANDALONELOGS * 预期的会话总数
例如,如果 MAXSTANDALONELOGS 设置为 5,ALLOWSESSIONLOGFILE 设置为 FALSE,并且估计在任何时候与地理数据库的连接数都不会超过 10,则将 LOGFILEPOOLSIZE 设置为 50。LOGFILEPOOLSIZE = 5 * 10。
- 如果独立的日志文件和会话日志文件都允许使用
LOGFILEPOOLSIZE = (MAXSTANDALONELOGS + 1) * 预期的会话总数
例如,如果 MAXSTANDALONELOGS 设置为 8,ALLOWSESSIONLOGFILE 设置为 true,并且估计在任何时候与数据库的连接数都不会超过 20,则将 LOGFILEPOOLSIZE 设置为 180。LOGFILEPOOLSIZE = (8 + 1) * 20。
如果池已用完且需要另一个日志文件表,则 ArcSDE 将尝试在用户的方案中创建该日志文件表。如果无法在用户的方案中创建该日志文件表,则会返回错误。
只要 LOGFILEPOOLSIZE 参数被更改,SDE_LOGPOOL_<table_ID> 表就会被创建或删除。在前面的示例中,当 LOGFILEPOOLSIZE 设置为 180 时,将创建 180 个 SDE_LOGPOOL_<table_ID> 表。如果将 LOGFILEPOOLSIZE 参数更改为 100,则那些表中将有 80 个被删除。
另一个日志文件池参数 HOLDLOGPOOLTABLES 确定 SDE_LOGPOOL 表返回到池的时间,并且可以由其他用户使用。如果 HOLDLOGPOOLTABLES 被设置为 TRUE(默认值),那么在连接会话终止之前,记录将一直保留在 SDE_LOGFILE_POOL 表中,SDE_LOGPOOL 表也将一直处于锁定状态。如果将 HOLDLOGPOOLTABLES 设置为 FALSE,那么只要不再需要选择集,就会释放日志文件表,并截断 SDE_LOGFILE_POOL 表。对于独立日志文件池和基于会话的日志文件池,此行为是相同的。
控制由 ArcSDE 管理员所有的日志文件池的存储所需的设置
sde_dbtune 表的 LOGFILE_DEFAULTS 关键字下仅有一些参数控制着 SDE_LOGPOOL<SDE_ID> 表及其索引的存储方式。
ArcSDE for SQL Server 使用 SDE_dbtune 表中的 LD_STORAGE 和 LD_INDEX_ALL 参数来设置 SDE_LOGPOOL<SDE_ID> 表及其索引的存储。这两个参数还控制着 SDE_LOGFILE_DATA 表和索引的存储。有关这些参数的说明,请参阅 SQL Server DBTUNE 配置参数。
要使用日志文件表池,无需设置这些参数;但如果要更改 SDE_LOGPOOL<SDE_ID> 表和索引在数据库中的存储方式,则可对这些参数进行设置。
使用由 ArcSDE 管理员所有的日志文件池所需的用户权限
要使用池中的日志文件表,用户只需要能够连接到数据库和使用地理数据库管理员方案中的对象。因此,使用日志文件表池只需要 CONNECT 权限。
默认情况下,会授予所有用户 CONNECT 权限;因此如果已从 PUBLIC 中撤消此权限,仅需显式授予该权限即可。