MySQL数据库改名的三种方法

本文介绍了在MySQL中安全地迁移数据库名的方法,包括使用mysqldump备份和恢复、创建新数据库并逐个迁移表,以及使用加密技术保护密码。特别强调了InnoDB与MyISAM的不同处理方式和安全注意事项。
摘要由CSDN通过智能技术生成

如果表是 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 ~]# 


# 删除旧库(如果真的需要)
DROP 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 $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
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                |
+--------------------+
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,改表名的命令,但是如果新表名后面加数据库名,就会将老数据库的表移动到新的数据库,所以,这种方法即安全,又快速。

参考链接:
https://ost.51cto.com/posts/16797
https://blog.csdn.net/China_AT001/article/details/116916740

番外:所有表是 MyISAM 修改数据库名
1.先停止数据库服务

systemctl stop mysqld
#service mysql stop

2.到数据库目录 mv
数据库目录默认在/var/lib/mysql/,可以通过 find / -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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值