MySQL-mysql增加分区是否会锁表

MySQL-mysql增加分区是否会锁表

想挽留 发布于 2017-06-06 字数 358 浏览 2675 回复 4

公司现有数据库,有一张表数据量较大,并且还一直跑着应用,不能停止数据库,我想对这张表按月创建分区,使用‘ALTER TABLE 表名 PARTITION BY RANGE(字段)……’命令增加分区,在执行这个操作后,发现数据库所带的应用无法写数据了。
因此我想想问对现在数据库表进行增加分区动作会锁表吗?如果锁表那有什么好的方法在我不停止应用和数据库的情况下去做分区呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夜无邪 2017-09-25 4 楼

目前mysql 优化器没有实现锁子表的功能,在执行更新操作时是锁住了全表。

http://forge.mysql.com/wiki/MySQL_Internals_Optimizer

Non-Transactional Table Engines.?? With non-transactional tables such as MyISAM, locks are placed on entire partitioned table. It is theoretically possible to use partition pruning to improve concurrency by placing locks only on partitions that are actually used, but this is currently not implemented.

Partition pruning doesn't depend on what table engine is used. Therefore its implementation is a part of the MySQL Query Optimizer. The next few sections provide a detailed description of partition pruning.

瑾兮 2017-09-15 3 楼

肯定会锁表的,可以考虑建新表,然后导入数据,再rename

夜无邪 2017-08-28 2 楼

这时文档链接 partitioning-limitations

Table locks. The process executing a partitioning operation on a table takes a write lock on the table. Reads from such tables are relatively unaffected; pending INSERT and UPDATE operations are performed as soon as the partitioning operation has completed.

读没有问题,写操作会pending...

夜无邪 2017-07-11 1 楼

运用不能停,还是考虑新建表吧。
1. 创建分区表
2. 在代码入库的地方加入一个插入新表的语句,或是使用触发器在原表有数据插入的同时也在新表插入
3. 逐步将原表的数据同步到新表
4. 数据同步一致后使用最短的时间切换至新表
这样基本能满足不停运用而使用了新的表结构