我们的数据库中有许多表,VARCHAR(MAX)其中包含 a VARCHAR(500)(或远小于 max 的值)就足够的列。当然,我想清理这些,并将尺寸缩小到更合理的水平。我明白如何做到这一点:我的问题是改变这些列会对磁盘上的页面和现存内容产生什么影响?(有很多关于当你增加一个列时会发生什么的信息,但是很难找到当你缩小一个时会发生什么的信息。)
有些表的行数非常少,所以我不担心更改的成本,但有些表非常大,我担心它们可能会被重组并导致大量阻塞/停机。实际上,我只是想要一种估计维护窗口的方法。一般来说,我想更好地了解数据库引擎在这种情况下的行为。
提前致谢!
编辑:
我正在查看 20 个表,但其中只有一半的行数大于 1,000。最大的有近一百万行。最糟糕的是一张有 350,000 行和 4VARCHAR(MAX)列的表格,可以缩小到一个VARCHAR(500)水平。
所以我有一个在复制流上设置的测试数据库服务器。在名称上出现了一个优化,它迅速填满了 slaves 数据目录上的空间。Mysql 尽职尽责地等待更多空间。
这个 datadir 是一个文件系统,只用作 mysql 的 datadir,所以没有其他东西可以释放。
我有一个 4 g innodb 测试表,它不是复制流的一部分,所以我想我会尝试一些东西来看看它是否有效,作为一个测试环境,如果事情出现严重错误,我并不太担心。
这是我采取的步骤
.err 日志中没有显示任何内容,看起来不错。我连接并使用 mydb;并查看我在展示表中弄乱的表。但是,如果我尝试
select * from testtable limit 10;
Run Code Online (Sandbox Code Playgroud)
我收到错误
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以从所有其他表中读取数据,并且复制开始备份,没有任何抱怨。
我能做些什么来从这一点上恢复过来吗?如果需要,我可以从头开始重建它,但很好奇其他人对这次冒险的总体看法。我采取的一系列步骤是否有任何结果会导致更完美的结果?
如果这不是一个测试服务器,我不能只是“实时运行”看看会发生什么?如果我不得不喜欢,有什么最好的方法可以暂时释放生产从站上的空间?
我想释放 Linux 机器上的磁盘空间。我已经深入研究了空间使用情况,发现以下目录的大小很大
/u01/app/11.2.0/grid/cv/log
/u01/app/11.2.0/grid/log/diag/tnslsnr/r1n1/listener_scan2/alert (Contains xml files)
/u01/app/11.2.0/grid/rdbms/audit(Contains .aud files)
/home/oracle/oradiag_oracle/diag/clients/user_oracle/host_XXXXXXXXXX/alert(Contains xml files)
/u01/app/oracle/diag/rdbms/crimesys/crimesys1/alert (Contains xml files)
Run Code Online (Sandbox Code Playgroud)
我可以删除这些目录中的内容吗?注意:我的意思是内容而不是目录。
我有TRUNCATE一个巨大的(~120Gb)表,名为files:
TRUNCATE files;
VACUUM FULL files;
Run Code Online (Sandbox Code Playgroud)
表大小为 0,但没有释放磁盘空间。任何想法如何回收我丢失的磁盘空间?
更新: 磁盘空间在大约 12 小时后释放,我这边没有任何操作。我使用 Ubuntu 8.04 服务器。
我正在开发一个开发系统,我一直在恢复到一个数据库,比如“foo”,我用于开发目的。当我解决这些问题时,我一直在运行 DROP DATABASE foo。但是,我很快意识到我已经吃光了磁盘上的所有空间。废话。
来自不同逻辑数据库的 VACUUM FULL 是否从我之前删除的数据库中释放空间 (foo)?我从不同的逻辑数据库尝试了这个,并且回收了可用空间,但我认为这不足以解释我所做的所有 CREATE DATABASE/DROP DATABASE 调用。它可能只是对我运行的逻辑数据库进行了 VACUUM 处理。
必须有一种方法可以在不执行整个数据库初始化的情况下回收该空间?
编辑
所以我从备份中重新初始化了数据库,大致遵循这些步骤。恢复后,我在磁盘上回收了大量空间!这暂时有效,但有关如何清理删除的数据库的任何帮助仍然有用。
编辑 2
所以我设法收集了一些关于这个问题的更多信息......这是我想出的一个例子:
Initial partition size:
Size Used Avail Use% Mounted on
25G 8.1G 16G 35% /apps1
After creating my new database and populating it:
25G 18G 6.4G 73% /apps1
After Dropping the database using "DROP database mydb" from a separate logical DB:
25G 13G 11G 56% /apps1
Run Code Online (Sandbox Code Playgroud)
所以在我看来,新数据库在磁盘上占用了大约 9.6 GB。但是,删除后,回收的磁盘空间仅增加了约 4.6G。所以,大约有 5 GB 的空间让我想知道发生了什么!?
当我重新创建、填充和再次删除时,它会继续这个循环。
有没有人知道发出“DROP DATABASE”命令后有什么东西挥之不去?
众所周知,DMV 不保存有关页数和行数的准确信息。但是,当您更新统计数据时,我不明白为什么他们不会。
我正在开发一个监控工具,想知道每个索引和数据的磁盘大小等。最终我想找到合适的填充因子,以及其他一些东西。
The space used by my function and the old sp_spaceused differs a little bit on the space usage, but not on record count.
Can you see if there is anything missing in my select?
this is the sp_spaceused (then I convert the numbers in MB):
sp_spaceused 'tblBOrderRelationship'
go
select 318008/1024.00 AS reserved,
140208/1024.00 AS data,
177048/1024.00 AS index_size,
752/1024.00 AS unused
Run Code Online (Sandbox Code Playgroud)

But when I run my select, code below\picture below, I get slightly different figures.
SET TRANSACTION …Run Code Online (Sandbox Code Playgroud) 我在 Postgres 数据库中有 4 亿行,表有 18 列:
id serial NOT NULL,
a integer,
b integer,
c integer,
d smallint,
e timestamp without time zone,
f smallint,
g timestamp without time zone,
h integer,
i timestamp without time zone,
j integer,
k character varying(32),
l integer,
m smallint,
n smallint,
o character varying(36),
p character varying(100),
q character varying(100)
Run Code Online (Sandbox Code Playgroud)
列e、k和n都是 NULL,它们根本不存储任何值,此时完全没用。它们是原始设计的一部分,但从未被移除。
编辑 - 大多数其他列都是非 NULL。
问题:
如何计算这对存储的影响?它是否等于列的大小 * 行数?
删除这些空列会显着提高该表的性能吗?页面缓存能够容纳更多行吗?
postgresql performance database-design storage disk-space postgresql-performance
我们在周五晚上 9 点运行每周备份作业,我们遇到了一些关于磁盘空间(有时会变得非常低)和性能方面的问题。我们正在考虑精简/优化所发生的事情,并感谢您的意见。
具体来说:
备份过程大约需要 4 小时才能在备份期间更新统计信息。我们可以安全地禁用此过程以节省时间吗?
我们经常会遇到磁盘空间不足的情况,想知道是否应该重新调整这个过程。目前它创建备份,然后删除以前的备份,这就是占用磁盘空间的原因。我们可以安全地删除前一首,然后做备份?
非常欢迎任何其他评论或意见编辑:服务器上 SQL 文件的总大小约为 35GB。一个 db 的大小约为 25GB,而其他 6 个共享组成了另外 10GB 左右。
我的笔记本电脑上安装了多个版本的 SQL Server,用于测试(2012、2014、2016 和 2017)。前几天我注意到有一个文件夹包含跨更新(SP、CU)的文件的先前版本。在所有版本中,实际上占用了相当多的空间:
(在C:\Program Files (x86)\Microsoft SQL Server\ 中)
110\Setup Bootstrap\Log - 91.8 MB (818 files)
110\Setup Bootstrap\Update Cache - 608 MB (2,382 files)
Run Code Online (Sandbox Code Playgroud)
(以下所有文件夹都位于:C:\Program Files\Microsoft SQL Server\)
110\Setup Bootstrap\Log - 1.18 GB (3,715 files)
110\Setup Bootstrap\Update Cache - 9.58 GB (14,766 files)
120\Setup Bootstrap\Log - 569 MB (2,963 files)
120\Setup Bootstrap\Update Cache - 5.74 GB (12,797 files)
130\Setup Bootstrap\Log - 448 MB (2,808 files)
130\Setup Bootstrap\Update Cache - 3.84 GB (8,579 files)
140\Setup …Run Code Online (Sandbox Code Playgroud) 我的问题针对 Postgres,但来自任何数据库背景的答案可能就足够了。
我的假设是否正确:
设置系统时最好将所有块都设置为 8k?还是设置不重要?我还想知道某些“错误”的块大小设置是否会在崩溃时危及数据完整性?也许如果必须将 Postgres 8k 块拆分为多个磁盘块?
或者没有任何东西一起批处理,因此我会因定义的块大小之间的每一次不匹配而丢失磁盘空间?
disk-space ×10
postgresql ×3
sql-server ×3
backup ×1
dmv ×1
index ×1
innodb ×1
maintenance ×1
management ×1
mysql ×1
oracle ×1
performance ×1
storage ×1
truncate ×1
varchar ×1