xml地图|网站地图|网站标签 [设为首页] [加入收藏]
Server事务复制搭建与同步经验,及不解析
分类:数据库

<if test="type ==1">
and DATE_FORMAT(create_date,'%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d')
</if>
<if test="type ==2">

一.概述、

  "流光容易把人抛,红了樱桃,绿了芭蕉“ 转眼又年中了,感叹生命的有限,知识的无限。在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存储, 最后简要介绍下系统页存储类型,页中的数据结构。

1.1  页存储

  页是 sql server存储数据的基本单位,大小为8kb, 它存储的类型包括表,索引数据,分配位图,可用空间信息等,页也是可以读写的最小I/0单位。也就是如只需访问一行数据,也会把整个页加载到内存中。一页大小是8192个字节,由三块组成分为页头,数据行 , 行偏移也叫页尾行指针。

  页头:有96个字节,包含的信息如PageID(文件号及页面编号),NextPage下一个页面的文件号及页面编号等。

  数据行:单个数据行最大为8060字节。

  末尾行偏移: 36字节的数组,数组中的每一个值指向页中数据。当插入一行数据时,偏移量从右下角开始存储,插入第二行时偏移量为2存放于1的左边,如下图所示:

图片 1

  一个页存储有三种分配单元类型: in_row_data (行内数据), row_overflow_data( 行溢出数据), lob_data LOB(大型数据)。

分配单元类型 描述
in_row_data 存放固定长度的列,以及可变长度的列。一行字节<= 8060字节的限制
row_overflow_data 存放<=8000字节的varchar,nvarchar, varbinary类型数据。一行字节>= 8060
lob_data 存放大型对象数据类型值 >=8000节字的varchar(max), nvarchar(max), varbinary(max), 以及xml或clr udt

1.2 区

   区是由8个物理上连续的页组成的单元,用来有效管理页,如是区内的8个页属于同一个表,则这种区叫统一区,如果区内8个页分别属于至少两个不同的表,则这种区叫混合区。当表或索引需要更多空间时,sqlserver会为对象分配一个新区,但对象不足64kb,通常只分配一个页,当drop或truncate表时将释放整个区。 

1.3 存储的关系

   每个数据表对应有一个objectID标识符,  表中有多个索引为 sys.indexes,   表和索引存储在多个分区中 sys.partitions,但至少有一个分区。每个分区下面有8个物理连续页, 页中使用最频繁的文件类型是Data数据。

  下图展示表和索引存储结构以及对应的元数据查询。 分配单元可通过SELECT * FROM sys.system_internals_allocation_units视图查看

图片 2

0. 环境

  1. 无域环境
  2. 发布服务和分发服务器同一台主机
角色 主机名 IP 发布名 发布库名/订阅库名
发布服务器 Server1 192.168.1.100 test3 db1
分发服务器(与发布服务器同一实例) Server1 192.168.1.100 - -
订阅服务器 Client1 192.168.1.200 - db1

<![CDATA[
and DATE_FORMAT(create_date,'%Y-%m-%d') >= DATE_FORMAT(#{minDate},'%Y-%m-%d')
and DATE_FORMAT(create_date,'%Y-%m-%d') <= DATE_FORMAT(#{maxDate},'%Y-%m-%d')
]]>
</if>
<if test="type ==3">
and DATE_FORMAT(create_date,'%Y-%m') = DATE_FORMAT(CURDATE(),'%Y-%m')
</if>

二. 索引与表存储关系演示

  2.1 首先建一个RowText表

CREATE TABLE [dbo].[RowText](
    [a] [varchar](3000) NULL
) ON [PRIMARY]

  2.2 根据表名,查到表的标识符objectID:  5575058。 这里显示了表的相关信息如创建时间,修改时间。

select * from sys.objects where name='RowText'

  图片 3

      2.3  根据标识符objectID,找到表上的多个分区,这里只有一个区。找到标识hobt_id(是该区里堆或B树结构的标识): 72057594038976512

select * from sys.partitions where object_id=5575058

     图片 4

  2.4  再根据hobt_id: 72057594038976512,找到页分配的单元, 这里现只显示了in_row_data  行内数据,信息包括了行内数据使用的总页数,已使用页数,数据页数

select * from sys.allocation_units where container_id=72057594038976512

   图片 5

1. 修改host文件

在发布服务器和订阅服务器都修改C:WindowsSystem32driversetc文件,加入IP和主机名。如果是请求订阅,则发布服务器不用修改也要可以;如果是推送请求,则必需设置。因为SQL Server复制不能通过IP进行相关的设置。

 

  三. 页分配单元演示

  3.1 上面讲到页分配单元有三种类型,通过下面的脚本可以来查看分析。

SELECT CONVERT(VARCHAR(10),OBJECT_NAME(i.object_id)) AS table_name,
     i.Name AS index_name,i.index_id,i.type_desc AS index_type,
     partition_id,partition_number,p.rows,allocation_unit_id,
     a.type_desc AS page_type_desc,
     a.total_pages,a.used_pages,a.data_pages
    FROM sys.indexes i JOIN sys.partitions p 
ON i.object_id=p.object_id and i.index_id=p.index_id
JOIN sys.allocation_units a ON p.partition_id=a.container_id
WHERE i.object_id=object_id('RowText')

  3.2 查看页存储的行内数据

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RowText]') AND type in (N'U'))
DROP TABLE [dbo].[RowText]

go
CREATE TABLE [dbo].[RowText](
    [a] [varchar](3000) NULL
) ON [PRIMARY]

insert into RowText
select REPLICATE('a',3000)
insert into RowText
select REPLICATE('a',3000)
insert into RowText
select REPLICATE('a',3000)

  当前一行数据3000字节,小于一行8000字节,所以存放为IN_ROW_DATA类型,新增三行共9000字节,大于了一页8060字节,所以产生了data_pages:2页。通过3.1脚本查看

 图片 6

  3.2 查看页存储的行溢出数据

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RowText]') AND type in (N'U'))
DROP TABLE [dbo].[RowText]
go
create TABLE [dbo].[RowText](
    [a] [varchar](3000) NULL,
    [b] [varchar](6000) NULL
) ON [PRIMARY]

insert into RowText
select REPLICATE('a',3000),REPLICATE('b',6000)

  当前一行数据为9000字节,大于一行8000字节,所以分配了ROW_OVERFLOW_DATA类型,通过3.1脚本查看

图片 7

  3.3  查看页存储的LOB大型数据

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RowText]') AND type in (N'U'))
DROP TABLE [dbo].[RowText]
go
CREATE TABLE [dbo].[RowText](
    [a] [varchar](3000) NULL,
    [b] [varchar](6000) NULL,
    [c] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

insert into RowText
select REPLICATE('a',3000),REPLICATE('b',6000),REPLICATE('c',12000)

  当前表包含了text类型,所以分配了LOB_DATA大型数据,通过3.1脚本查看

  图片 8

       最后简单总结下:在设计表字段时,一定要与业务相符合,尽量避免建大型字段,产生行溢出和LOB大型数据,从而造成页拆分,查询将需要跨页。原理是当一行超过8060字节时,这类型的值将被移动到一个称为行溢出分配单元页中,在原始页上保留一个24字节指针,指向行外数据,这样就完成了行跨页。 存放大型对象数据类型值时,在原始页上保留一个16字节指针,指向该大型对象值。

2. 创建快照文件夹及相应的用户和权限

比如快照文件在发布服务器的D:ReplData下。在发布服务器和订阅服务器创建相同的Windows用户( 如果不想发布服务器创建新的Windows用户,则需要在发布服务器开启Guest用户),如repl_admin,并加入各自的administrator组中,并设置密码不能过期,不能修改密码。设置D:ReplData文件对于新建的用户repl_admin完全读写权限,并设置共享此文件夹。

这里,可能会有疑问为什么repl_admin已经是administrator组的用户,对D:ReplData文件夹是读取权限的,为什么还要设置repl_admin完全读写权限?后来测试在生成快照文件时,无法在文件夹\Server1ReplData写入。后面第4步会提到\Server1ReplData这个文件夹。

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:Server事务复制搭建与同步经验,及不解析

上一篇:本地电脑无法连接到MySQL,Mysql索引使用 下一篇:通过mycat实现mysql的读写分离,取消数值四舍五入
猜你喜欢
热门排行
精彩图文