如果表是 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;
最终结果目录改了,数据库没显示,操作失败不知道啥原因,以后再看吧