我在ALTER
巨大的(InnoDB)MySQL表上遇到了麻烦。表格的ID列(主键)定义为UNSIGNED INT
,但达到了它的最大值(4294967295)。
为了能够向此表添加更多行,我需要将此列的类型调整为BIGINT
。但是,标准的MySQL ALTER
命令(以及我迄今为止发现的任何其他解决方案)将尝试使用新定义生成新表,然后将所有数据复制到其中。对于这种情况下的表,这需要942.0Gb的可用磁盘空间,而我只有271Gb可用(并且没有其他分区确实具有所需的磁盘空间)。
是否有任何解决方案不需要原始表的完整复制(而是将数据移动到新表或类似的东西)?
我不在乎在更换桌子时无法访问桌子,桌子可以完全锁定几个小时而没有任何问题(我现在无法使用它)
答案 0 :(得分:2)
由于你有271Gb的可用磁盘空间,如果几小时内没有访问表,你就可以了,请按照以下步骤操作:
tbl_temp
ID
BIGINT
为tbl_temp
,保持剩余的表格结构完全相同。tbl_temp
。$(document).ready(function () {
var variante = $('.produs_varianta');
var produs_varianta = [];
variante.each(function (index) {
produs_varianta.push(
{
'produs': $(this).find('.product_name').val(),
'cod': $(this).find('.product_code').val()
}
);
});
// NOW READ THE PRODUCTS AND ITS CODES.
$.each(produs_varianta, function (key) {
alert(produs_varianta[key].produs + ': ' + produs_varianta[key].cod);
});
});
重命名为原始表格。这样您就可以使用现有磁盘空间迁移整个数据。
答案 1 :(得分:0)
我接受this answer from Samir,因为这是我意见的最佳解决方案,但我以稍微不同的方式解决了问题。我一开始没想到的是我们拥有对S3的AWS账户和(CLI)访问权限。所以,我做了以下几点:
mysqldump -f --no-create-info --lock-tables db_name table_name | gzip -c | aws s3 cp - s3://bucket-name/mysqldump.sql.gz --expected-size 130608821125
DROP
原始表格(是的,完全是为了换新的表格)CREATE
新表,完全与原始表名相同,使用更新的CREATE语句(实现我需要的新BIGINT
定义)aws s3 cp s3://bucket-name/mysqldump.sql.gz - | gzip -d | mysql db_name
这种方法优于Samir's answer的优势在于它不易出错,因为没有可编写脚本来使其工作。
缺点是(我认为)由于额外的压缩,解压缩和网络传输,完成整个过程需要更长的时间。在我的情况下完成整个过程大约需要5天,而我认为Samir的解决方案应该更快,这就是我接受它的原因。