Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改具有5200万行的mysql表的列精度_Mysql - Fatal编程技术网

更改具有5200万行的mysql表的列精度

更改具有5200万行的mysql表的列精度,mysql,Mysql,一些白痴(读:我)无意中以错误的精度将列添加到MySQL表中。在我们开始与日本客户打交道之前,一切都很好,现在专栏不够大 问题是这个表现在有5200万行 实际上有18列(!)是错误的,但只有两列需要更改。如果有一种方法可以同时完成所有18项,好的。否则就只有这两个了 如何在不锁定表或导致其他问题的情况下(在生产中)执行此操作?最好不要花24小时 是否正在创建一个新表,复制数据,然后重命名/删除方法 创建具有正确定义的新表 将数据从旧复制到新 重命名旧表 重命名新表 放下旧桌子 哪一个最好?基本上

一些白痴(读:我)无意中以错误的精度将列添加到MySQL表中。在我们开始与日本客户打交道之前,一切都很好,现在专栏不够大

问题是这个表现在有5200万行

实际上有18列(!)是错误的,但只有两列需要更改。如果有一种方法可以同时完成所有18项,好的。否则就只有这两个了

如何在不锁定表或导致其他问题的情况下(在生产中)执行此操作?最好不要花24小时

是否正在创建一个新表,复制数据,然后重命名/删除方法

  • 创建具有正确定义的新表
  • 将数据从旧复制到新
  • 重命名旧表
  • 重命名新表
  • 放下旧桌子

  • 哪一个最好?

    基本上就是这样,是的。我建议使用一个工具来实现这一点。查看pt在线模式更改。这是一部分

    它所做的是在表上创建触发器,以便将新的/更新的数据传输到临时表。将数据复制到新的(更改的)表后,它会重命名这些表

    示例用法如下所示:

    # pt-online-schema-change --dry-run --alter "change col1 col1 decimal(10,2), change col2 col2 decimal(10,2)" --alter-foreign-keys-method=auto --max-load Threads_connected=500 --critical-load Threads_connected=1000 D=your_database_name,t=your_table_name,u=your_mysql_user,p=your_mysql_user_password
    
    但请仔细阅读手册。
    当表上已经有触发器时,这种方法也不起作用(取决于您使用的MySQL版本。较新版本允许在同一个表上有多个触发器)。

    当然,表有18列,都需要非整数,数字数据类型-但请注意,这可能是架构设计不佳的症状。请尝试在alter语句中添加
    algorithm=inplace
    。它要么工作并仅锁定表一秒钟左右,要么失败并出现错误(取决于列类型)。@vatev正如您在中看到的那样,需要一个完整的锁,因此这不起作用。@brother表实际上有30列。18.需要改变。它是一个表,表示/保存来自第三方站点的发票信息。这一点都没有错。@fancyPants如果没有完整的表锁,在MySQL中修改表是100%不可能的。唯一的问题是它会被锁定多久。谢谢。我已经看过pt在线模式更改,但是文档非常糟糕。从外观上看,它完成了我列出的所有5个步骤…因为恢复数据库可能需要24小时,我宁愿不要出错。我只能说,我是一名有6年经验的数据库管理员。我一直在使用它,到目前为止还没有出现问题。但我当然会建议事先测试它。