How do I quickly rename a MySQL database (change schema name)?

前端 未结 30 2803
余生分开走
余生分开走 2020-11-22 14:54

The MySQL manual at MySQL covers this.

Usually I just dump the database and reimport it with a new name. This is not an option for very big databases. Apparently

30条回答
  •  长情又很酷
    2020-11-22 15:10

    It is possible to rename all tables within a database to be under another database without having to do a full dump and restore.

    DROP PROCEDURE IF EXISTS mysql.rename_db;
    DELIMITER ||
    CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
    BEGIN
    SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
    SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
    SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
    END||
    DELIMITER ;
    
    $ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot
    

    However any triggers in the target db will not be happy. You'll need to drop them first then recreate them after the rename.

    mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
    ERROR 1435 (HY000) at line 4: Trigger in wrong schema
    

提交回复
热议问题