Loading... > 如果表是 **MyISAM** 那么可以直接去到数据库目录 **mv** 就可以。 > Innodb完全不行,自己测试过,会提示相关表不存在。 ## 第一种方法: ```msyql RENAME database olddbname TO newdbname ``` 这个语法在 mysql-5.1.7 中被添加进来,到了mysql-5.1.23又去掉了,官方不推荐,会有丢失数据的危险! ## 第二种方法: 1.创建需要改成新名的数据库。 2.mysqldum 导出要改名的数据库 3.删除原来的旧库(确定是否真的需要) 当然这种方法虽然安全,但是如果数据量大,会比较耗时。 ```msyql #创建数据库 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** ```bash #!/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脚本中把明文密码暴露出来。。。 ```bash [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** ```bash #!/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** ```bash [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** ```bash #!/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 ``` ```bash [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://ost.51cto.com/posts/16797) [https://blog.csdn.net/China_AT001/article/details/116916740](https://blog.csdn.net/China_AT001/article/details/116916740) 番外:所有表是 **MyISAM** 修改数据库名 1.先停止数据库服务 ```bash systemctl stop mysqld #service mysql stop ``` 2.到数据库目录 **mv** 数据库目录默认在/var/lib/mysql/,可以通过 `find / -name mysql` 查找 ```bash mv /var/lib/mysql/old_database /var/lib/mysql/new_database ``` 3.启动数据库服务 ```bash systemctl start mysqld #service mysql start ``` 4.登录mysql,如果显示new_database数据库,说明修改成功数据库名了 ```bash show databases; ``` 最终结果目录改了,数据库没显示,操作失败不知道啥原因,以后再看吧 最后修改:2023 年 11 月 28 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏