开发者

MySQL数据库改名的三种实现方式

目录
  • 第一种方法
  • 第二种方法
  • 第三种方法
  • 番外:所有表是 MyISAM 修改数据库名
    • 1.先停止数据库服务
    • 2.到数据库目录 mv
    • 3.启动数据库服务
    • 4.登录mysql
  • 总结

    如果表是 MyISAM 那么可以直接去到数据库目录 mv 就可以。

    Innodb完全不行,自己测试过,会提示相关表不存在。

    第一种方法

    RENAME database olddbname TO newdbname

    这个语法在 mysql-5.1.7 中被添加进来,到了mysql-5.1.23又去掉了,官方不推荐,会有丢失数据的危险!

    第二种方法

    • 1.创建需要改成新名的数据库。
    • 2.mysqldum 导出要改名的数据库
    • 3.删除原来的旧库(确定是否真的需要)

    当然这种方法虽然安全,但是如果数据量大,会比较耗时。

    #创建数据库
    CREATE DATABASE IF NOT EXISTS `库名` default charset utf8mb4 COLLATE utf8mb4_unicode_ci;
    
    # 将db1库备份到db1.sql文件
    mysqldump -u root -p db1 > /tmp/db1.sql;
    
    #Enter password: 
    #[root@xxx ~]# 
    
    # 导入备份文件到新库DB2
    mysql -u root -p db2 < /tmp/db1.sql;
    
    #Enter password: 
    #[root@xxx ~]# 
    
    
    # 删除旧库(如果真的需要)
    DRwww.devze.comOP DATABASE db1;

    第三种方法

    我这里就用一个脚本,很简单,相信大家都看的懂

    newdatabase.sh

    #!/bin/bash
    # 假设将db1数据库名改为db2
    # MyISAM直接更改数据库目录下的文件即可
    # 下面脚本是创建新数据库,获取旧数据库所有表名,将其循环移动到新数据库
    
    mysql -uroot -p123456 -e 'create database if not exists db2'
    list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'")
    
    for table in $list_table
    do
        mysql -uroot -p123456 -e "rename table db1.$table to db2.$table"
    done

    -p123456脚本中把明文密码暴露出来。。。

    [root@xxx script]# mysql --version
    mysql  Ver 8.0.35 for linux on x86_64 (MySQL Community Server - GPL)
    
    [root@xxx script]# bash newdatabase.sh 
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    #mysql:[警告]在命令行界面使用密码可能是不安全的。 

    执行成功了但不安全,我们做下调整:

    • 生成密文 sginpwd.sh
    #!/bin/bash
    function b64Code()
    {
        #参数1: 需要加密的串
        passauth=$1
        #参数2: 加密的次数,次数越多密码越长
        for i in `seq 1 $2`
        do
            #python2
            passauth=`echo $passauth |python -c "import base64;s=raw_input();print(base64.b64encode(s))"`
            #python3
            #passauth=`echo $passauth |python -c "import base64;s=input(); print(base64.b64encode(s.encode()).decode());"`
            echo "[+]第${i}次加密结果:$passauth"
        done
    }
    
    #执行 b64Code 加密方法,使用明文密码加密10次
    b64Code 123456 10
    #密码是字符串加上单引号
    • 执行sginpwd.sh
    [root@xxx script]# bash sginpwd.sh
    [+]第1次加密结果:MTIzNDU2
    [+]第2次加密结果:TVRJek5EVTI=
    [+]第3次加密结果:VFZSSmVrNUVWVEk9
    [+]第4次加密结果:VkZaU1NtVnJOVVZXVkVrOQ==
    [+]第5次加密结果:VmtaYVUxTnRWbkpPVlZaWFZrVnJPUT09
    [+]第6次加密结果:Vm10YVlWVXhUblJXYmtwUFZsWmFXRlpyVm5KUFVUMDk=
    [+]第7次加密结果:Vm0xMFlWbFdwWGhVYmxKWFltdHdVRlpzV21GWFjscHlWbTVLVUZWVU1Eaz0=
    [+]第8次加密结果:Vm0weE1GbFdiRmRXV0doVllteEtXRmx0ZEhkVlJscHpWMjFHV0ZKc2NIbFdiVFZMVlVaV1ZVMUVhejA9
    [+]第9次加密结果:Vm0wd2VFMUdiRmRpUm1SWFYwZG9WbGx0ZUV0WFJteDBaRWhrVmxKc2NIcFdNakZIVjBaS2MyTkliRmRpVkZaTVZsVmFWMVpWTVVWaGVqQTk=
    [+]第10次加密结果:Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9
    • newdatabase_beff.sh
    #!/bin/bash
    # 假设将db1数据库名改为db2
    # MyISAM直接更改数据库目录下的文件即可
    # 下面脚本是创建新数据库,获取旧数据库所有表名,将其循环移动到新数据库
    
    function deCode()
    {
        #参数1: 加密串内容
        passDstr=$1
        #参数2: 密码解析次数
        for i in `seq 1 $2`
        do
            passDstr=`echo $pa编程客栈ssDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"`
        done
    }
    
    #b64Code方法得到的密文放在这里
    mysqlPass="Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9"
    #使用加密10次的密文 解密
    deCode $mysqlPass 10
    mysql -uroot -p"${passDstr}" -e "show databases;"
    
    mysql -uroot -p"${passDstr}" -e 'create database if not exists db2'
    list_table=$(mysql -uroot -p"${passDstr}" -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'")
    
    for table in $list_table
    do
        mysql -uroot -p"${passDstr}" -e "rename table db1.$table to db2.$table"
    done
    function deCode()
    {
        #参数1: 加密串内容
        passDstr=$1
        #参数2: 密码解析次数
        for i in `seq 1 $2`
        do
    		#python2
    		passDstr=`echo $passDstr |python -c "import base64;s=raw_input();print(base64.b64decode(s))"`
    		#python3
            #passDstr=`echo $passDstr |python -c "import base64;s=input(); print(base64.b64decode(s.encode()).decode());"`
    
        done
    }
    
    #b64Code方法得到的密文放在这里
    mysqlPass="Vm0wd2QyVkZNVWRpUm1ScFVtMVNXRll3Wkc5V2JHeDBaVVYwV0ZKdGVEQmFSV2hyVm14S2MyTkljRmROYWtaSVZqQmFTMk15VGtsaVJtUnBWa1phVFZac1ZtRldNVnBXVFZWV2FHVnFRVGs9"
    #使用加密10次的密文 解密
    deCode $mysqlPass 10
    mysql -uroot -p"${passDstr}" -e "show databases;"
    
    mysql -uroot -p"${passDstr}" -e 'create database if not exists db2'
    list_table=$(mysql -uroot -p"${passDstr}" -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'")
    
    for table in $list_table
    do
        mysql -uroot -p"${passDstr}" -e "rename table db1.$table to db2.$table"
    done
    [root@xxx script]# bash newdatabase_beff.sh
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +--------------------+
    | Database           |
    +--------------------+
    | db1                |
    | db2                www.devze.com|
    +--------------------+编程
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    
    #登录mysql,可以看到db1数据表迁移到db2了
    mysql> use db1;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +---------------+
    | Tables_in_db1 |
    +---------------+
    | active_log    |
    | new           |
    +---------------+
    2 rows in set (0.00 sec)
    
    mysql> show tables;
    Empty set (0.00 sec)
    
    mysql> use db2;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +---------------+
    | Tables_in_db2 |
    +---------------+
    | active_log    |
    | new           |
    +---------------+
    2 rows in set (0.00 sec)

    这里用到了rename table,改表名的命令,但是如果新表名后面加数据库名,就会将老数据库的表移动到新的数据库,所以,这种方法即安全,又快速。

    番外:所有表是 MyISAM 修改数据库名

    1.先停止数据库服务

    systemctl stop mysqld
    #service mysql stop
    

    2.到数据库目录 mv

    数据库目录默认在/var/lib/mysql/,可以通http://www.devze.comfind / -name mysql 查找

    mv /var/lib/mysql/old_database /var/lib/mysql/new_database

    3.启动数据库服务

    systemctl start mysqld
    #service mysql start

    4.登录mysql

    如果显示new_database数据库,说明修改成功数据库名了

    show databases;

    最终结果目录改了,数据库没显示,操作失败不知道啥原因,以后再看吧

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜