Mysql 批量 改 表 引擎

     这篇文章与前面写的”Spring事务控制”是有冲突的,前面我提到验证了数据库表引擎即使是MyISAM事务控制依然正常,但是今天正式系统出现的事务控制失败,将库表引擎改为InnoDB后事务控制成功,这又恰恰反驳了我之前的验证(看来还不能盖棺定论,前面的验证还得重来)。

    现在说怎么实现“批量”更新库表引擎。

    如果是单个表,我们可以通过 ALTER  TABLE TABLENAME ENGINE = InnoDB;来实现修改。

    改整个库的话就要批量更新,网上提供的脚本好复杂,而且还需要重复刷脚本。我这里偷懒了,换了种批量修改的方式,看以下代码。

 

package com.修改数据库引擎;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.jdbc.JDBCFactory;

/**
 * 修改库表引擎
 * @author Administrator
 * 这里的思想很简单,就是获取数据库所有表的表名并存在数组里。然后遍历数据打印输出
 * 修改每一个表引擎的sql
 */
public class 修改库表引擎 {
    //存储表名
    public static String[] tablenames=null;
   
    //静态块,程序运行时首先初始化tablenames
    static {
        Connection con = JDBCFactory.getCon();
        Statement stmt;
        try {
            stmt = con.createStatement();
            //查出所有表名
            ResultSet rst = stmt.executeQuery("SHOW TABLES");
            List<String> tables=new ArrayList<String>();
            while(rst.next())
            {
                tables.add(rst.getString(1));
            }
            tablenames=tables.toArray(new String[]{});
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
   
    /**
     * 主函数
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < tablenames.length; i++) {
            //遍历输出修改引擎sql
            System.out.println("ALTER  TABLE "+tablenames[i]+" ENGINE = InnoDB;");;
        }
    }
}

 

 

将控制台打印出来的结果Copy执行就OK啦。

<think>我们面对的任务是批量修改MySQL数据库中多个的存储引擎为InnoDB。 方法一:使用ALTER TABLE语句逐个修改,但效率低。 方法二:生成并执行批量修改的SQL脚本。 步骤: 1. 生成需要修改。我们可以通过查询information_schema数据库来获取当前数据库(或指定数据库)中所有非InnoDB引擎。 2. 为每个生成一个ALTER TABLE语句,并将这些语句保存到一个SQL脚本中。 3. 执行这个SQL脚本。 具体操作: 步骤1:查询非InnoDB引擎 假设我们要修改数据库名为`your_database_name`,则查询语句如下: ```sql SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND ENGINE <> 'InnoDB'; ``` 注意:这里我们排除了已经是InnoDB引擎。 步骤2:生成修改脚本 我们可以使用GROUP_CONCAT(在MySQL中)或者使用编程方式(如使用脚本语言)来生成多个ALTER TABLE语句。 但是,如果很多,我们可以用以下方式在MySQL中生成一个包含所有ALTER语句的SQL文件: 方法A:使用SQL生成语句并输出到文件 ```sql SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND ENGINE <> 'InnoDB' INTO OUTFILE '/path/to/alter_engine.sql'; ``` 注意:使用INTO OUTFILE需要MySQL有文件写入权限,且文件路径必须是MySQL服务端可写的。 方法B:在命令行中使用批处理 我们也可以在命令行中使用mysql命令结合sed或awk来生成并执行: ```bash mysql -u username -p -e "SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' ENGINE=InnoDB;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='your_database_name' AND ENGINE <> 'InnoDB'" | grep 'ALTER' > alter_engine.sql ``` 然后,我们可以检查生成的alter_engine.sql文件,确认无误后执行: ```bash mysql -u username -p your_database_name < alter_engine.sql ``` 方法C:使用存储过程(不推荐,因为需要创建和删除存储过程,且可能涉及权限) 步骤3:执行生成的SQL文件 如上所示,使用mysql命令行客户端执行生成的SQL文件。 注意事项: 1. 在修改之前,请确保备份数据库,因为修改存储引擎可能会影响数据(特别是从MyISAM转到InnoDB,两种引擎的索引结构不同,锁和行锁的区别等)。 2. 修改过程中会锁,所以请在业务低峰期操作。 3. 检查是否有使用了InnoDB不支持的特性(如MyISAM的全文本索引,在InnoDB中从MySQL5.6开始支持,但如果是更早的版本则不支持)。 4. 如果很大,修改可能需要较长时间。 另外,如果数据库中有视图,则不需要修改,因为视图没有存储引擎的概念。 因此,批量修改的步骤如下: 1. 备份数据库。 2. 生成修改脚本(如上所述)。 3. 执行修改脚本。 下面是一个完整的示例(假设数据库名为mydb): 生成脚本文件: ```sql mysql -u root -p -e "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ENGINE=InnoDB;') AS sql_stmt FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb' AND ENGINE <> 'InnoDB' AND TABLE_TYPE='BASE TABLE'" > alter_engine.sql ``` 然后检查alter_engine.sql文件,再执行: ```bash mysql -u root -p mydb < alter_engine.sql ``` 注意:这里我们过滤了TABLE_TYPE='BASE TABLE',因为information_schema.TABLES中还包括视图(VIEW),而视图不需要修改存储引擎。 如果中包含外键约束,在修改存储引擎之前,需要确保外键约束在InnoDB中能够正确工作(InnoDB支持外键,而MyISAM不支持)。如果从MyISAM转到InnoDB,那么之前没有检查的外键约束现在会被InnoDB强制执行,所以需要确保数据满足外键约束。 另外,如果从MyISAM转换到InnoDB,原有的FULLTEXT索引在MySQL5.6之前是不支持的,需要删除全文索引或者升级MySQL版本。在MySQL5.6及以上版本,InnoDB支持全文索引。 因此,在转换之前,最好检查一下结构,特别是索引部分。 总结:批量修改MySQL的存储引擎为InnoDB,核心是生成并执行一组ALTER TABLE语句。通过查询information_schema.TABLES获取非InnoDB引擎,然后为每个生成ALTER TABLE语句并执行。 相关问题: 1. 如何检查MySQL的当前存储引擎? 2. 将MyISAM转换为InnoDB需要注意哪些问题? 3. 如何批量修改MySQL数据库中的所有的主键? 4. 在修改存储引擎时,如何避免长时间锁? 5. MySQL中InnoDB和MyISAM存储引擎的主要区别是什么?</think>### 批量修改MySQL存储引擎为InnoDB的方法 #### 方法一:使用SQL脚本生成器(推荐) ```sql -- 步骤1:生成批量修改语句 SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` ENGINE=InnoDB;') AS sql_statement FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND ENGINE <> 'InnoDB' -- 排除已是InnoDB的 AND TABLE_TYPE = 'BASE TABLE'; -- 仅处理普通 -- 步骤2:执行生成的SQL -- 将上一步的输出结果复制执行 ``` #### 方法二:命令行批量操作 ```bash # 生成并直接执行修改命令 mysql -u用户名 -p密码 -Nse \ "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` ENGINE=InnoDB;') \ FROM information_schema.TABLES \ WHERE TABLE_SCHEMA = '你的数据库名' \ AND ENGINE != 'InnoDB'" | \ mysql -u用户名 -p密码 你的数据库名 ``` #### 方法三:存储过程批量修改 ```sql DELIMITER $$ CREATE PROCEDURE convert_to_innodb() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tbl_name VARCHAR(255); DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ENGINE != 'InnoDB'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; convert_loop: LOOP FETCH cur INTO tbl_name; IF done THEN LEAVE convert_loop; END IF; SET @sql = CONCAT('ALTER TABLE ', tbl_name, ' ENGINE=InnoDB'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; END$$ DELIMITER ; -- 执行存储过程 CALL convert_to_innodb(); ``` ### 注意事项 1. **权限要求**:需要`ALTER`权限和`information_schema`查询权限 2. **备份优先**:操作前务必备份数据库 3. **锁影响**:大转换可能长时间锁,建议在低峰期操作 4. **外键约束**:InnoDB强制外键约束,转换前需确保数据一致性 5. **特殊索引**:MyISAM的`FULLTEXT`索引需转换为InnoDB格式(MySQL 5.6+支持) 6. **系统**:不要修改`mysql`系统库中的 ### 验证转换结果 ```sql -- 检查非InnoDB SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND ENGINE <> 'InnoDB'; ``` > **重要提示**:从MyISAM转换到InnoDB时,空间管理方式会变(.frm/.MYD → 系统空间/独立空间),建议转换后运行`OPTIMIZE TABLE`重组数据[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值