SQL 2008 发布订阅的时间怎么测

时间:2022-11-23 17:11:23
两台PC机,PC1新建一个发布服务器,PC2新建一个订阅服务器,然后两者可以共享数据。
问题:
1.当我向PC1的数据库里面插入10000条数据的时候,PC2的数据库会同步数据,但是我怎么知道从PC1开始插入时,到PC2同步完成这阶段的时间呢??
我需要知道它们两个的同步速度,也就是一秒钟能够同步多少数据,来决定是否可以采用订阅发布的方式在局域网内进行数据同步。
2.同步的速度与网络环境有关吗?
3.在网上看到的资料里面,说这种同步方式不是实时的,我记得设置了一个10秒一同步的。那这种方式进行数据库的同步好吗?有没有更好的办法?

16 个解决方案

#1


数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步

#2


如果你要实时同步,可以考虑用数据库镜像,里面有2种模式,其中的同步模式就是实时同步,而且当某一台数据库出现故障时,能自动秒级故障转移。

#3


不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据

#4


引用 1 楼 yupeigu 的回复:
数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步


可是我这边在插入数据的时候同时在那边查询,会发现数据几乎(时间不等)同时从那边传递过来了。
是不是在插入数据的时候就开始第一次同步操作,每过10秒再开始一次同步操作?

#5


引用 3 楼 yupeigu 的回复:
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据


不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。

#6


在订阅库做个循环,10秒count一下,

#7


引用 6 楼 DBA_Huangzj 的回复:
在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?

#8


引用 7 楼 niceteamwork 的回复:
Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入

#9


引用 5 楼 niceteamwork 的回复:
Quote: 引用 3 楼 yupeigu 的回复:

不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据


不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。


那就只能用数据库集群试试了,另外,如果是sql server 2012可以试试always on,实现你的需求确定没问题的

#10


实时的读写分离一般是复制和alwayson,如果不实时的话可以用log shipping或者镜像+快照

#11


引用 8 楼 DBA_Huangzj 的回复:
Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教

#12


你不用做job啊,直接在查询界面用while死循环,内容是select count(1) from table 或者:
SELECT rowcnt FROM sys.sysindexes WHERE id=OBJECT_ID('表名')

等发布端插入完毕你就停了循环

#13


这样写吧:
SELECT rowcnt,getdate()
 FROM sys.sysindexes WHERE id=OBJECT_ID('表名')

#14


引用 11 楼 niceteamwork 的回复:
Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据

#15


引用 14 楼 yupeigu 的回复:
Quote: 引用 11 楼 niceteamwork 的回复:

Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据


当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?

#16


引用 15 楼 niceteamwork 的回复:
Quote: 引用 14 楼 yupeigu 的回复:

Quote: 引用 11 楼 niceteamwork 的回复:

Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据


当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?


开始同步的时间确实是不确定的,数据库复制,是由代理作业来驱动的,代理作业按照设置的间隔时间可以设置为10秒,那么理论上,这个代理作业应该是每间隔10秒,开始同步,至于每次同步需要多少时间,我觉得在局域网内,应该是非常快的,应该是少于10秒内,就能同步完成

#1


数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步

#2


如果你要实时同步,可以考虑用数据库镜像,里面有2种模式,其中的同步模式就是实时同步,而且当某一台数据库出现故障时,能自动秒级故障转移。

#3


不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据

#4


引用 1 楼 yupeigu 的回复:
数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步


可是我这边在插入数据的时候同时在那边查询,会发现数据几乎(时间不等)同时从那边传递过来了。
是不是在插入数据的时候就开始第一次同步操作,每过10秒再开始一次同步操作?

#5


引用 3 楼 yupeigu 的回复:
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据


不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。

#6


在订阅库做个循环,10秒count一下,

#7


引用 6 楼 DBA_Huangzj 的回复:
在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?

#8


引用 7 楼 niceteamwork 的回复:
Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入

#9


引用 5 楼 niceteamwork 的回复:
Quote: 引用 3 楼 yupeigu 的回复:

不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据


不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。


那就只能用数据库集群试试了,另外,如果是sql server 2012可以试试always on,实现你的需求确定没问题的

#10


实时的读写分离一般是复制和alwayson,如果不实时的话可以用log shipping或者镜像+快照

#11


引用 8 楼 DBA_Huangzj 的回复:
Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教

#12


你不用做job啊,直接在查询界面用while死循环,内容是select count(1) from table 或者:
SELECT rowcnt FROM sys.sysindexes WHERE id=OBJECT_ID('表名')

等发布端插入完毕你就停了循环

#13


这样写吧:
SELECT rowcnt,getdate()
 FROM sys.sysindexes WHERE id=OBJECT_ID('表名')

#14


引用 11 楼 niceteamwork 的回复:
Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据

#15


引用 14 楼 yupeigu 的回复:
Quote: 引用 11 楼 niceteamwork 的回复:

Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据


当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?

#16


引用 15 楼 niceteamwork 的回复:
Quote: 引用 14 楼 yupeigu 的回复:

Quote: 引用 11 楼 niceteamwork 的回复:

Quote: 引用 8 楼 DBA_Huangzj 的回复:

Quote: 引用 7 楼 niceteamwork 的回复:

Quote: 引用 6 楼 DBA_Huangzj 的回复:

在订阅库做个循环,10秒count一下,


在哪里做?是直接在新建查询里面写一个吗?
嗯,在订阅端的库中,做个循环,然后发布端开始插入


我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教


那肯定是看不到的,因为你的是作业,是在后台运行的。

这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据


当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?


开始同步的时间确实是不确定的,数据库复制,是由代理作业来驱动的,代理作业按照设置的间隔时间可以设置为10秒,那么理论上,这个代理作业应该是每间隔10秒,开始同步,至于每次同步需要多少时间,我觉得在局域网内,应该是非常快的,应该是少于10秒内,就能同步完成