小编Noa*_*oam的帖子

从 InnoDB 表中删除和回收空间

我有一个 700GB 的 InnoDB 表,我不再向其中写入任何数据(仅读取)。我想删除它保存的旧数据并回收该磁盘空间(因为我用完了)。删除部分非常简单,因为我有一个 auto-inc 主索引,所以我可以使用它在块中进行迭代,并删除行,但这不会让我回到空间。我认为OPTIMIZE TABLE会,但在 700GB 的表上可能需要永远,那么我忽略了另一个选择吗?

由 RolandoMySQLDBA 编辑

假设您的表是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)

mysql innodb

24
推荐指数
1
解决办法
7万
查看次数

将 600GB 表索引键数据类型从 INT 更改为 BIGINT 的最快方法

我需要将 600GB MySQL 表中的数据类型从 INT 更改为 BIGINT。该列具有唯一索引。我可能对 unsigned INT 很好,但我认为更改为 unsigned 或 BIGINT 将几乎相同的痛苦。该表的引擎是 InnoDB。什么会更容易:

  1. 更改表
  2. 复制结构和 INSERT INTO (SELECT *)
  3. 转储表和更改转储文件表定义
  4. 还要别的吗?

更新:根据要求,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)

mysql database-design alter-table mysql-5.5

13
推荐指数
1
解决办法
3653
查看次数

表上的 MySQL 索引创建失败已满

更新: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)

mysql innodb index

11
推荐指数
1
解决办法
2万
查看次数

Percona xtrabackup 是我 500GB MySQL 备份的正确选择吗?

我有一个 500GB 的 MySQL 数据库,主要由 Innodb 表和一个大 (200GB) MyISAM 表组成。我当前的备份策略是将 db 文件复制到外部硬盘驱动器。这会导致约 4 小时的停机时间。我的需求:

  1. 低成本。
  2. 恢复时间可能很长。无需实时复制。
  3. 可以处理 1 周到 2 周范围内的数据丢失。
  4. 希望备份的停机时间尽可能短,但最多可以忍受 2 小时。

目前正在考虑尝试迁移到 Percona xtrabackup。它是否适合我的用例?我特别担心它会锁定 MyISAM 表和学习曲线。

mysql innodb myisam backup xtrabackup

8
推荐指数
1
解决办法
6457
查看次数

在具有 48GB RAM 的服务器上正确调整 30GB InnoDB 表

我有一个 30GB 15M 行的 InnoDB MySQL 5.5.15 表。它在具有许多其他 MyISAM 表 (300GB db) 的服务器上运行。该系统具有48GB RAM。除了默认配置之外,我还更改了以下值:

  • InnoDB 缓冲池到 10GB
  • 日志文件大小 5M

请注意,我key_buffer_size的 MyISAM 是 8GB,我还允许 Memcache 使用 8GB,并安装了 Redis(不确定他需要多少)。

我还应该尝试配置更多值吗?

mysql innodb myisam database-design configuration

5
推荐指数
1
解决办法
5061
查看次数