做项目的时候,由于本地数据库,太老了,没有最新的数据,这也就导致,有些情况,我们无法模拟出来,无法从根本上解决问题。
这也就出现了,我们需要经常进行导库的情况了。那什么是导库,那就是把生产环境的数据,导入到我们这边的开发环境。
这样就可以将数据维度还原一致,帮助我们开发更好的判断问题的所在。
在介绍背景后,我们就来介绍跟还原下导入数据库所发现的问题如下:
导入数据库,但是发现导出来的库竟然有二十几个G,那我们本地的硬盘可能没有办法,导入这么大的数据库,
那遇到这些问题的时候,我们要怎么办,我们就试着不导入这些库里边的所有数据,适当的将数据删除,最后得到这个最小的库。
这时候,可能会有疑问,就是正式库的数据可以随便删除吗?
我们这里的库是生产环境里边的测试数据库,所以数据是可以随便删除的。
在我们删除数据之前,我们要排查哪些表的数据过大,从而对该表的数据进行删除,所以要排查下哪些表占用空间过大.
这里有的人可能会凭借经验来判断,但是,有时候判断不准确,并且也浪费我们的时间,最好的方法是用语句进行排查。
CREATE PROCEDURE [dbo].[P_UpdateTableSpaceInfo]
AS
BEGIN
--查询是否存在结果存储表
IF NOT EXISTS (SELECT * FROM sysobjects where id = OBJECT_ID(N'temp_tableSpaceInfo')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
--不存在则创建
CREATE TABLE temp_tableSpaceInfo
(name NVARCHAR(128),
rows char(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18))
END
--清空数据表
DELETE FROM temp_tableSpaceInfo
--定义临时变量在遍历时存储表名称
DECLARE @tablename VARCHAR(255)
--使用游标读取数据库内所有表表名
DECLARE table_list_cursor CURSOR FOR
SELECT name FROM sysobjects
WHERE OBJECTPROPERTY(id, N'IsTable') = 1 AND name NOT LIKE N'#%%' ORDER BY name
--打开游标
OPEN table_list_cursor
--读取第一条数据
FETCH NEXT FROM table_list_cursor INTO @tablename
--遍历查询到的表名
WHILE @@FETCH_STATUS = 0
BEGIN
--检查当前表是否为用户表
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(@tablename)
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
--当前表则读取其信息插入到表格中
EXECUTE sp_executesql N'INSERT INTO temp_tableSpaceInfo
EXEC sp_spaceused @tbname', N'@tbname varchar(255)', @tbname = @tablename
END
--读取下一条数据
FETCH NEXT FROM table_list_cursor INTO @tablename
END
--释放游标
CLOSE table_list_cursor
DEALLOCATE table_list_cursor
END
GO
EXEC P_UpdateTableSpaceInfo
SELECT * FROM temp_tableSpaceInfo where rows>10000
2.0 通过以上语句,我们可以查出哪些表格的数据过多,从而有选择性的进行删除,让导出来的数据库容量变小。
以下是大于10W条数据的,可以选择性删除用不到的数据.
以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。
要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。
- THE END -
最后修改:2024年7月22日
共有 0 条评论