如果表是 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,改表名的命令,但是如果新表名后面加数据库名,就会将老数据库的表移动到新的数据库,所以,这种方法即安全,又快速。
番外:所有表是 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;
最终结果目录改了,数据库没显示,操作失败不知道啥原因,以后再看吧
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。