安全地更改 MySQL 5.5 中的列
Safely alter a column in MySQL 5.5
我发现自己在照看一个旧的 testlink 安装,所有负责的人都离开了,我已经好几年没有认真地 SQL 工作了。
底层数据库版本为5.5.24-0ubuntu0.12.04.1
我没有所有的密码,但我有足够的权限进行无锁备份;
mysqldump --all-databases --single-transaction -u testlink -p --result-file=dump2.sql
我真的不想尝试恢复数据!
我们需要增加testlink中name字段的长度,各种页面导致我增加了nodes_hierarchy table.
中的一个字段的长度
备份产生了这个;
CREATE TABLE `nodes_hierarchy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
`node_type_id` int(10) unsigned NOT NULL DEFAULT '1',
`node_order` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid_m_nodeorder` (`parent_id`,`node_order`)
) ENGINE=MyISAM AUTO_INCREMENT=184284 DEFAULT CHARSET=utf8;
我真的只有一次机会做对,不能丢失任何数据。这看起来完全正确吗?
ALTER TABLE nodes_hierarchy MODIFY name VARCHAR(150) DEFAULT NULL;
这是正确的语法。
备份
无论此操作有多安全,您都应该备份数据库。看来你已经在计划了。您不太可能会遇到问题。备份只是一种保险政策,以应对不太可能发生的情况。
测试table
您似乎有大约 20 万条记录。我建议您复制一份 table,方法是:
CREATE TABLE `test_nodes_hierarchy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
`node_type_id` int(10) unsigned NOT NULL DEFAULT '1',
`node_order` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `test_pid_m_nodeorder` (`parent_id`,`node_order`)
) ENGINE=MyISAM AUTO_INCREMENT=184284 DEFAULT CHARSET=utf8;
填充测试table
用以下内容填充测试 table:
insert into test_nodes_hierarchy
select *
from nodes_hierarchy;
运行 更改此测试的状态 table
找出 alter 语句在测试中需要多长时间 table。
ALTER TABLE test_nodes_hierarchy
MODIFY name VARCHAR(150) DEFAULT NULL;
重命名测试table
练习重命名测试 table 使用:
RENAME TABLE test_nodes_hierarchy TO test2_nodes_hierarchy;
一旦你知道了它所花费的时间,你就知道在主要 table 上会发生什么。如果出现问题,您可以替换掉 nodes_hierarchy table 并重命名 test_nodes_hierarchy table.
这只会建立对操作的信心。
我发现自己在照看一个旧的 testlink 安装,所有负责的人都离开了,我已经好几年没有认真地 SQL 工作了。
底层数据库版本为5.5.24-0ubuntu0.12.04.1
我没有所有的密码,但我有足够的权限进行无锁备份;
mysqldump --all-databases --single-transaction -u testlink -p --result-file=dump2.sql
我真的不想尝试恢复数据!
我们需要增加testlink中name字段的长度,各种页面导致我增加了nodes_hierarchy table.
中的一个字段的长度备份产生了这个;
CREATE TABLE `nodes_hierarchy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
`node_type_id` int(10) unsigned NOT NULL DEFAULT '1',
`node_order` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `pid_m_nodeorder` (`parent_id`,`node_order`)
) ENGINE=MyISAM AUTO_INCREMENT=184284 DEFAULT CHARSET=utf8;
我真的只有一次机会做对,不能丢失任何数据。这看起来完全正确吗?
ALTER TABLE nodes_hierarchy MODIFY name VARCHAR(150) DEFAULT NULL;
这是正确的语法。
备份
无论此操作有多安全,您都应该备份数据库。看来你已经在计划了。您不太可能会遇到问题。备份只是一种保险政策,以应对不太可能发生的情况。
测试table
您似乎有大约 20 万条记录。我建议您复制一份 table,方法是:
CREATE TABLE `test_nodes_hierarchy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`parent_id` int(10) unsigned DEFAULT NULL,
`node_type_id` int(10) unsigned NOT NULL DEFAULT '1',
`node_order` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `test_pid_m_nodeorder` (`parent_id`,`node_order`)
) ENGINE=MyISAM AUTO_INCREMENT=184284 DEFAULT CHARSET=utf8;
填充测试table
用以下内容填充测试 table:
insert into test_nodes_hierarchy
select *
from nodes_hierarchy;
运行 更改此测试的状态 table
找出 alter 语句在测试中需要多长时间 table。
ALTER TABLE test_nodes_hierarchy
MODIFY name VARCHAR(150) DEFAULT NULL;
重命名测试table
练习重命名测试 table 使用:
RENAME TABLE test_nodes_hierarchy TO test2_nodes_hierarchy;
一旦你知道了它所花费的时间,你就知道在主要 table 上会发生什么。如果出现问题,您可以替换掉 nodes_hierarchy table 并重命名 test_nodes_hierarchy table.
这只会建立对操作的信心。