问题:
1.当我向PC1的数据库里面插入10000条数据的时候,PC2的数据库会同步数据,但是我怎么知道从PC1开始插入时,到PC2同步完成这阶段的时间呢??
我需要知道它们两个的同步速度,也就是一秒钟能够同步多少数据,来决定是否可以采用订阅发布的方式在局域网内进行数据同步。
2.同步的速度与网络环境有关吗?
3.在网上看到的资料里面,说这种同步方式不是实时的,我记得设置了一个10秒一同步的。那这种方式进行数据库的同步好吗?有没有更好的办法?
16 个解决方案
#1
数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步
#2
如果你要实时同步,可以考虑用数据库镜像,里面有2种模式,其中的同步模式就是实时同步,而且当某一台数据库出现故障时,能自动秒级故障转移。
#3
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据
#4
可是我这边在插入数据的时候同时在那边查询,会发现数据几乎(时间不等)同时从那边传递过来了。
是不是在插入数据的时候就开始第一次同步操作,每过10秒再开始一次同步操作?
#5
不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。
#6
在订阅库做个循环,10秒count一下,
#7
在哪里做?是直接在新建查询里面写一个吗?
#8
嗯,在订阅端的库中,做个循环,然后发布端开始插入
#9
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据
不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。
那就只能用数据库集群试试了,另外,如果是sql server 2012可以试试always on,实现你的需求确定没问题的
#10
实时的读写分离一般是复制和alwayson,如果不实时的话可以用log shipping或者镜像+快照
#11
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,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('表名')
等发布端插入完毕你就停了循环
SELECT rowcnt FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
等发布端插入完毕你就停了循环
#13
这样写吧:
SELECT rowcnt,getdate()
FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
SELECT rowcnt,getdate()
FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
#14
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教
那肯定是看不到的,因为你的是作业,是在后台运行的。
这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据
#15
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教
那肯定是看不到的,因为你的是作业,是在后台运行的。
这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据
当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?
#16
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,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
数据库同步与订阅,最短的同步间隔时间是10秒,也就是至少得10秒,才会同步
可是我这边在插入数据的时候同时在那边查询,会发现数据几乎(时间不等)同时从那边传递过来了。
是不是在插入数据的时候就开始第一次同步操作,每过10秒再开始一次同步操作?
#5
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据
不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。
#6
在订阅库做个循环,10秒count一下,
#7
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
#8
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
#9
不过,这个数据库镜像,从主体同步到镜像之后,这个镜像数据库,不能读取数据,也就是无法实现,读写分离,通过创建数据库快照,倒是能读取一个时间点之前的数据
不能用镜像,因为另一个数据库要随时准备充当主数据库的角色,两个数据库都应该能读写。
那就只能用数据库集群试试了,另外,如果是sql server 2012可以试试always on,实现你的需求确定没问题的
#10
实时的读写分离一般是复制和alwayson,如果不实时的话可以用log shipping或者镜像+快照
#11
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,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('表名')
等发布端插入完毕你就停了循环
SELECT rowcnt FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
等发布端插入完毕你就停了循环
#13
这样写吧:
SELECT rowcnt,getdate()
FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
SELECT rowcnt,getdate()
FROM sys.sysindexes WHERE id=OBJECT_ID('表名')
#14
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教
那肯定是看不到的,因为你的是作业,是在后台运行的。
这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据
#15
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教
那肯定是看不到的,因为你的是作业,是在后台运行的。
这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据
当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?
#16
嗯,在订阅端的库中,做个循环,然后发布端开始插入
在订阅库做个循环,10秒count一下,
在哪里做?是直接在新建查询里面写一个吗?
我在SQL 2008里面设置了一个计划,让它每隔十秒钟(貌似这个是最短的时间了)运行一次,然后在计划里面每隔1秒查询一次(SELECT COUNT(*) FROM table_name),但是我从哪里知道结果呢?好像没看到有地方能看到执行结果,请版主指教
那肯定是看不到的,因为你的是作业,是在后台运行的。
这个数据库复制,至少也得10秒,如果网速快,延迟会小,但是再怎么小也会大于10秒,如果事务量很大,可能不一定在10秒内能同步完,所以当你在主库上插入或者更新后,马上去查询订阅数据库,应该查询到的还是以前的数据
当我在一边插入数据的时候,另一边马上刷新,有可能(只是有可能)在几秒内(不大于十秒)数据就会同步过来了。而有时候要大于10秒数据才过来(就几条数据,应该可以忽略同步时间)
当插入大量数据的时候,一边在插入数据,我在另一边执行SELECT * FROM dev,会有查询结果(当然数量上是不完整的),也就是说,SQL2008 并不一定是在10秒后才开始同步,也不一定在10秒内开始同步吧?这个开始同步的时间应该是不确定的吧?
开始同步的时间确实是不确定的,数据库复制,是由代理作业来驱动的,代理作业按照设置的间隔时间可以设置为10秒,那么理论上,这个代理作业应该是每间隔10秒,开始同步,至于每次同步需要多少时间,我觉得在局域网内,应该是非常快的,应该是少于10秒内,就能同步完成