我有一个 700GB 的 InnoDB 表,我不再向其中写入任何数据(仅读取)。我想删除它保存的旧数据并回收该磁盘空间(因为我用完了)。删除部分非常简单,因为我有一个 auto-inc 主索引,所以我可以使用它在块中进行迭代,并删除行,但这不会让我回到空间。我认为OPTIMIZE TABLE
会,但在 700GB 的表上可能需要永远,那么我忽略了另一个选择吗?
假设您的表是mydb.mytable
,请运行以下查询并将其发布到此处,以便您可以确定表收缩所需的磁盘空间:
SELECT
FORMAT(dat/POWER(1024,3),2) datsize,
FORMAT(ndx/POWER(1024,3),2) ndxsize,
FORMAT((dat+ndx)/POWER(1024,3),2) tblsize
FROM (SELECT data_length dat,index_length ndx
FROM information_schema.tables WHERE
table_schema='mydb' AND table_name='mytable') A;
Run Code Online (Sandbox Code Playgroud)
如果允许,我们还需要查看表结构。
这是查询的输出:
数据大小 ndxsize tblsize
682.51 47.57 730.08
这是表结构 ( SHOW CREATE TABLE
)
`CREATE TABLE `mybigtable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`text` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci …
Run Code Online (Sandbox Code Playgroud) 我需要将 600GB MySQL 表中的数据类型从 INT 更改为 BIGINT。该列具有唯一索引。我可能对 unsigned INT 很好,但我认为更改为 unsigned 或 BIGINT 将几乎相同的痛苦。该表的引擎是 InnoDB。什么会更容易:
INSERT INTO (SELECT *)
更新:根据要求,MySQL 5.5.15 版,没有外键并创建表:
CREATE TABLE `tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`f` tinyint(1) NOT NULL,
`i_id` bigint(20) NOT NULL,
`ir_id` int(11) NOT NULL,
`r_c` int(11) NOT NULL,
`r` tinyint(1) NOT NULL,
`e` text CHARACTER SET …
Run Code Online (Sandbox Code Playgroud) 更新:tl;dr:问题是 MySQLTMPDIR
在创建索引时使用。而我TMPDIR
的磁盘空间不足。
原问题:
我正在尝试向 InnoDB 表添加索引,并获得table is full error
. 我有足够的磁盘空间,并且 MySQL 配置有一个 file-per-table=1。表数据为 85GB,我假设索引将在 20GB - 30GB 左右,而且我的磁盘空间比这多得多。我也在使用 ext3,所以从操作系统的角度来看,我认为文件大小限制没有任何问题。
记录的错误如下所示:
140616 13:04:33 InnoDB: Error: Write to file (merge) failed at offset 3 1940914176.
InnoDB: 1048576 bytes should have been written, only 970752 were written.
InnoDB: Operating system error number 0.
InnoDB: Check that your OS and file system support files of this size.
InnoDB: Check also that the disk is not full or a …
Run Code Online (Sandbox Code Playgroud) 我有一个 500GB 的 MySQL 数据库,主要由 Innodb 表和一个大 (200GB) MyISAM 表组成。我当前的备份策略是将 db 文件复制到外部硬盘驱动器。这会导致约 4 小时的停机时间。我的需求:
目前正在考虑尝试迁移到 Percona xtrabackup。它是否适合我的用例?我特别担心它会锁定 MyISAM 表和学习曲线。
我有一个 30GB 15M 行的 InnoDB MySQL 5.5.15 表。它在具有许多其他 MyISAM 表 (300GB db) 的服务器上运行。该系统具有48GB RAM。除了默认配置之外,我还更改了以下值:
请注意,我key_buffer_size
的 MyISAM 是 8GB,我还允许 Memcache 使用 8GB,并安装了 Redis(不确定他需要多少)。
我还应该尝试配置更多值吗?