当前位置: 代码网 > it编程>数据库>Mysql > MySQL数据库改名的三种实现方式

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

2024年07月05日 Mysql 我要评论
如果表是 myisam 那么可以直接去到数据库目录 mv 就可以。innodb完全不行,自己测试过,会提示相关表不存在。第一种方法rename database olddbname to newdbn

如果表是 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;

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com