数码复印机、网络打印机全球分布信息收集展示视频

2011年的时候参与一个复印机数据安全检查研究项目,当时在网络上收集了很多关于数码复印机数据安全相关的材料,发现其中一个视频非常有意思。该视频使用google earth作为全球IP地址分布统计定位,把收集到的所有公开在公网上的复印机IP地址或域名,用google earth定点定位方法,制作出整个地球的复印机分布情况,非常直观,非常震撼!
在当时制作视频时,中国大陆的网络复印机对外公网IP数量比较少,亚洲主要集中在台湾地区、日本、韩国这三国。
在将近1年来,全球勒索病毒根据windows某个或某些漏洞,大肆残虐有漏洞的计算机,如果能把这些IP地址做成视频,估计将更震撼。
下面附加视频地址:
https://haokan.baidu.com/v?pd=bjh_app&vid=7293939213431372935

精确查找可以插入重复记录的表,解决记录重复的问题

曾经有个用户在恢复用友数据库时,还原到用友环境时,发现菜单重复,一个按钮变出好几个相同的按钮,就像孙悟空拔出毫毛变出好多个小孙悟空,一直在捉弄那个不会处理重复数据的抓耳挠腮的老妖精。本文介绍处理重复数据的处理方法。

  1. 找出可以插入重复数据的表

use [你要处理的数据库]

———————————————————————————–

select id,name from sysobjects where id in(

SELECT object_id FROM sys.indexes where object_id not in(

SELECT object_id FROM sys.indexes where is_unique=1 or is_primary_key=1 or is_unique_constraint=1)

) and xtype=’U’ order by name

———————————————————————————–

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\XG~%5GE85]D]_P5[0EKIIEW.png

再次过滤出哪些表存放有数据

———————————————————————————–

SELECT object_name (i.id) TableName,

rows as RowCnt

FROM sysindexes i

INNER JOIN sysObjects o

ON (o.id = i.id AND o.xType = ‘U’)

WHERE indid < 2 and RowCnt>0 and i.id in(

select id from sysobjects where id in(

SELECT object_id FROM sys.indexes where object_id not in(

SELECT object_id FROM sys.indexes where is_unique=1 or is_primary_key=1 or is_unique_constraint=1)

) and xtype=’U’

)

ORDER BY RowCnt desc

———————————————————————————–

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\GD5~)DLUKL3$I48T@RW07WA.png

  1. 处理重复数据的表,使相同记录只留一条

案例处理:重复数据处理测试.dbo.UA_Log_Ex 表有记录 520714条

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\X$BS7JR`~DZ67GP~HTE9$MG.png

去重查询方法:

USE [重复数据处理测试]

GO

———————————————————————————–

SELECT [cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

FROM 重复数据处理测试.dbo.UA_Log_Ex

group by

[cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

———————————————————————————–

把所有字段用group by 就能过滤出唯一的记录

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\V@0J{HISI$[MGM$){2HY6OV.png

看处理后,记录数量减半,数量为260357条

把过滤后的记录插入一张临时表重复数据处理测试.dbo.TempTable,这个表会自动生成

USE [重复数据处理测试]

GO

———————————————————————————–

SELECT [cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

into 重复数据处理测试.dbo.TempTable

FROM 重复数据处理测试.dbo.UA_Log_Ex

group by

[cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

———————————————————————————–

结果如下
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\2QNYNV]8}ZS8AZPDZ1()P}1.png

最后一步,把原表数据清空,把重复数据处理测试.dbo.TempTable表数据搬回来

delete FROM [重复数据处理测试].[dbo].[UA_Log_Ex] –删除原表数据

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\CJATBJY7]$Y)P7$(4C_RZ{P.png

把数据从重复数据处理测试.dbo.TempTable表数据搬回来

insert into [重复数据处理测试].[dbo].[UA_Log_Ex]

SELECT [cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

FROM [重复数据处理测试].[dbo].[TempTable]

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\_M9%Q1TR3K_4MTO0%[MR2EN.png

查看结果:
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\O{DT85D42XVL_~RRBKART`G.png

到此就处理结束了

  1. 总结
  2. 过滤重复记录查询用 group by 所有字段
  3. 把过滤结果插入新临时表 into Temptable
  4. 清除原表数据 delete from table
  5. 把临时表数据搬回原始表,用 insert into 原表

达思覃廷良2019-05-06

快速清空表数据及有效方法

清空表数据,保留视图,存储过程,函数,以及保留表约束、触发器等等,可以给故障数据库预留一个好的躯壳,把坏库数据导入此躯壳。对用友、金蝶等数据库恢复有时候能达到好的效果。

清除表数据有两种方法:

一种用delete from [表名] ,这种方法对于大数据库,速度慢,会产生很大的日志信息,对于小库,速度可以忽略;

另一种是truncate table [表名] ,这种方法速度快,但清除不了具有外键的表数据。

在清除表数据时,可以采用两种方法结合。

清除表数据时先禁用一切约束,清除完成以后再次启用约束就行了。

  1. 采用truncate table [表名] 清除表数据,排除具有外键属性的表,清除语句获取如下:

Use [要操作的库名字]

———————————————————————–

select

‘alter table [‘ +name+ ‘] nocheck constraint all; alter table [‘ +name + ‘] disable trigger all;

truncate table [‘+name+’];’

+ ‘ alter table [‘ +name + ‘] enable trigger all; alter table [‘ +name + ‘] check constraint all;

go’

from sysobjects where id not in(select parent_object_id from sys.foreign_keys ) and id not in(select referenced_object_id from sys.foreign_keys ) and type=’U’

———————————————————————–

上述SQL语句得到的结果,再次在SQL查询分析器里运行。

2、用 delete from [表名] 清除表数据语句获取如下

Use [要操作的库名字]

———————————————————————–

SELECT ‘alter table [‘ +object_name (id) + ‘] nocheck constraint all; alter table [‘ +object_name (id) + ‘] disable trigger all;

delete from [‘+object_name (id)+’];’ + ‘

alter table [‘ +object_name (id) + ‘] enable trigger all; alter table [‘ +object_name (id) + ‘] check constraint all;

go’

TableName from sysobjects where type=’U’

———————————————————————–

  1. 有些MS SQL Server查询分析器,对于 上述语句后面的 go ,copy出来后不自动换行,可以把运行结果保存到文本文件中,查询分析器打开以后,会自动换行。如果不自动换行,sql语句执行报错。
  2. 可能遇到清除不了的某些表,查看它和哪些表关联外键,先把两个表的约束同时禁用,再用delete from [表名],完了以后,两个表同时恢复约束使用。
  3. 查看清除数据是否成功彻底,用下述语句查看记录数量:

Use [要操作的库名字]

———————————————————————–

SELECT object_name (i.id) TableName,

rows as RowCnt

FROM sysindexes i

INNER JOIN sysObjects o

ON (o.id = i.id AND o.xType = ‘U ‘)

WHERE indid < 2 and RowCnt>0

ORDER BY RowCnt desc

———————————————————————–

达思覃廷良 2019-05-05

MS SQL Server数据恢复软件测试(数据表内容对比)

上一篇“导出记录数量对比-软件测试方法(一)”,主要介绍数据导出结果记录数量和原始正常好库的记录数量精确对比,测试软件导出少数据的相关bug。

本文测试方法旨在更精确比对表记录内部数据差异,记录数量的对比只是恢复准确率的必要条件,而记录内部的字段数据内容是否一致,才是比较的终极目标。

  1. 测试目的:在很多情况下,数据导出是以记录数量来衡量是否齐全。在某些情况下,数据记录数量导出是一致的,但,记录内部数据却出现差异,比如某些数字字段,一旦出现差异,其结果将带来不准确。本测试大纲目的是比对表中记录数据是否有差异,一旦出现差异,想办法修改软件,达到更准确的恢复效果。

二、测试工具:tablediff.exe,这个工具就用于表内部数据比较,是MS SQL Server自带的一个工具。各位可以自行搜索自己机器上的这个文件所在的路径。

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\N2C06Y$@{~KFPUTE4{B%J_J.png

三、构建数据表比较SQL语句:
———————————————————————————-

use UFDATA_006_2015_好酷

SELECT ‘tablediff.exe -sourceserver 127.0.0.1\SQL2008R2 -sourceuser sa -sourcepassword dst -sourcedatabase UFDATA_006_2015_好酷 -sourceschema dbo -sourcetable ‘+object_name (id)

+’ -destinationserver 127.0.0.1\SQL2008R2 -destinationuser sa -destinationpassword dst -destinationdatabase UFDATA_006_2015_好酷_out -destinationschema dbo -destinationtable ‘

+object_name (id)+’ -et Difference -f c:\data\’+object_name (id)+’.sql’ as SQL

from sysObjects where type =’U’

—————————————————————————————

解析:-sourceserver 127.0.0.1\SQL2008R2 原始数据库实例
sourceuser sa -sourcepassword dst -sourcedatabase UFDATA_006_2015_好酷

sa是原始数据库用户,dst是sa用户的密码,各位根据自己的设置更改,UFDATA_002_2017_原始好库是原始数据库。

-destinationserver 127.0.0.1\SQL2008R2 -destinationuser sa -destinationpassword dst -destinationdatabase UFDATA_002_2017_好库导出

127.0.0.1\SQL2008R2 是目标数据库实例,可以跨越实例比较,sa dst UFDATA_006_2015_好酷_out 都是目标数据库用户名、密码、库名称

f c:\data\’+object_name (id)+’.sql’ 这个是把比较结果,写道c:\data目录下,用表的名字命名。

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\2V$}G{XZDF`$LW]`[D1IFYE.png

四、语句执行方法
找到tablediff.exe文件路径
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\C8]}7`3I@TEJ}U%ZS(7@]FC.png

进入cmd模式下,在路径上输入cmd,回车
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\11WNV~1F1`1]N3625_W50O7.png

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\BVK(OVH76)GI]3{(C%}WI7B.png

把得到的SQL语句复制,贴到cmd窗口上。

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\38CBR(G9B2RJPRG8OC05(RT.png

建好c:\data 目录,修改好权限

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\M4%~D_@P57BV[CPWDAAZOZ2.png

设置sa登录,及密码

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\WYX(4LJ)VXI1%SM)OXET9{2.png

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\%)X5(MYP7COI)3{_V7DT@TU.png

把得到的SQL语句复制,贴到cmd窗口上:
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\{}2S~IX(B0Z5{E{4_EJAZ96.png

自动运行:

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\5P0BO9]0RL$~TAKD}UX@3GI.png

五、等待运行结果
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\BX]9_O0}K@1M5M4YYMG)A0R.png

总结查看不同的结果,把结果做成汇总,如若发现大的出入,有可能的话可提供数据库给我。我邮箱12869803@qq.com

达思覃廷良2019-05-05

MS SQL Server数据恢复软件测试(导出结果记录数量对比)

  1. 测试目的:MS SQL Server数据恢复软件是一款恢复故障数据库的工具,其设计的目的是为了解决坏库的数据恢复。本工具最基本的恢复功能是正常情况下能恢复出任何好库的数据而不存在偏差,但在实际情况下,各种应用的数据库存在着不同的使用场景以及开发环境,有着细微差异,软件恢复要顾及到各种细节,难免会漏掉一些关键细节而导致恢复结果不一定能达到100%,所以数据库恢复测试比对能得出相应的改进办法,提高软件质量。
  2. 测试步骤:对一个好库的测试,我们在实际数据恢复业务中,会接触到各种各样的应用数据库,在这些数据库中,有坏库,也有坏库的备份(好的备份),我们本次测试的数据库来源,就是这些好的备份的库,用这些好的备份数据库,可以精确比对恢复结果。测试步骤如下:
  3. 把好的数据库备份附加或者还原到MS SQL Server数据库中,得到一个健康的测试数据库。
  4. 停止MS SQL Server服务,把第一步得到的数据库,COPY出一份,然后再启动MS SQL Server服务。COPY出来的数据库文件用于MS SQL Server数据恢复软件的打开和读取。
  5. 用MS SQL Server数据恢复软件打开COPY出来的数据库,把数据导入一个新的数据库中。
  6. 如图:好的数据库名称是“UFDATA_006_2015_好酷” , 导出的数据库名称为:“UFDATA_006_2015_好酷_out”

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\J~C765K)I2`P58MP}7~MA6R.png

  1. 数据数据导完以后,就可以进行数据比对测试了。导出结果比对步骤如下:
  2. 新建一个数据库,起名为:T,如下:

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\M9O)LC%6Z9E1C[V{{9Y2YU0.png

创建两个表,用于存放“UFDATA_006_2015_好酷” 和 “UFDATA_006_2015_好酷_out”的表名和记录数量:建表语句如下

CREATE TABLE [T].[dbo].[UFDATA_006_2015_好酷_Count](

[Name] [nvarchar](512) NULL,

[num] [nvarchar](512) NULL

) ON [PRIMARY]

CREATE TABLE [T].[dbo].[UFDATA_006_2015_好酷_out_Count](

[Name] [nvarchar](512) NULL,

[num] [nvarchar](512) NULL

) ON [PRIMARY]

建表完成以后如下:

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\H[NKZR_~Q280DX)A9S%PT3I.png

  1. 构建获取表记录数的语句:

use UFDATA_006_2015_好酷

select ‘use UFDATA_006_2015_好酷

insert into [T].[dbo].[UFDATA_006_2015_好酷_Count](Name,num) select object_name (‘+convert(nvarchar,id)+’),count(*) from [UFDATA_006_2015_好酷].[dbo].[‘+name+’]’

from sysObjects where xtype=’U’ order by id

得到UFDATA_006_2015_好酷数据库的所有表记录获取语句,把表名字和记录插入[T].[dbo].[UFDATA_006_2015_好酷_Count]表中,把以上SQL语句执行得到的加过复制再来,在运行,就能得到表[T].[dbo].[UFDATA_006_2015_好酷_Count]的数据了

use UFDATA_006_2015_好酷_out

select ‘use UFDATA_006_2015_好酷_out

insert into [T].[dbo].[UFDATA_006_2015_好酷_out_Count](Name,num) select object_name (‘+convert(nvarchar,id)+’),count(*) from [UFDATA_006_2015_好酷_out].[dbo].[‘+name+’]’

from sysObjects where xtype=’U’ order by id

执行跟上面一样

得到每个表记录数的语句

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\D8W6}2EM`F949@5_M)G%3O2.png

把每张表的记录数插入新建的表中

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\Q]OD_ABUDKZ348[04`W(CVU.png

  1. 比较记录数不一样的表

记录数一样的表

SELECT A.[Name]

,A.[num]

,B.[Name]

,B.[num]

FROM [T].[dbo].[UFDATA_006_2015_好酷_Count] A ,[T].[dbo].[UFDATA_006_2015_好酷_out_Count] B

where A.Name=B.Name and A.num=B.num order by convert(int,A.num) desc

记录数比导出结果多的表

SELECT A.[Name]

,A.[num]

,B.[Name]

,B.[num]

FROM [T].[dbo].[UFDATA_006_2015_好酷_Count] A ,[T].[dbo].[UFDATA_006_2015_好酷_out_Count] B

where A.Name=B.Name and A.num>B.num order by convert(int,A.num) desc

记录数比导出结果少的表

SELECT A.[Name]

,A.[num]

,B.[Name]

,B.[num]

FROM [T].[dbo].[UFDATA_006_2015_好酷_Count] A ,[T].[dbo].[UFDATA_006_2015_好酷_out_Count] B

where A.Name=B.Name and A.num<B.num order by convert(int,A.num) desc

三、测试提示及反馈:本次测试,因为用正常好库测试,测试时可以分两种情况来做,有心测试的,可以选择删除恢复,看看最后恢复效果有所不同。 C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\~6LTZP1[~5CM3)H5[KU5MNV.png

四、每个人可以把测试结果给出一份简要报告,分享在测试群里,或者发送到邮箱12869803@qq.com 。如果测试出一些bug问题,有可能的话,也把测试数据库给我看看。

达思覃廷良 于2019-05-05