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

 更新时间:2024年06月13日 14:50:04   作者:程序员达芬奇  
这篇文章主要介绍了MySQL数据库改名的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在VB.NET应用中使用MySQL的方法

    在VB.NET应用中使用MySQL的方法

    这篇文章主要介绍了在VB.NET应用中使用MySQL的方法,操作基于Visual Studio IDE进行,需要的朋友可以参考下
    2015-06-06
  • 你知道哪几种MYSQL的连接查询

    你知道哪几种MYSQL的连接查询

    连接(join)查询是将两个查询的结果以“横向对接”的方式合并起来的结果,这篇文章主要给大家介绍了关于MYSQL连接查询的相关资料,需要的朋友可以参考下
    2021-06-06
  • MySQL不区分大小写配置方法

    MySQL不区分大小写配置方法

    MySQL 表内数据条件查询不区分大小写是因为排序规则的问题,本文主要介绍了MySQL不区分大小写配置方法,对大家的学习或者工作有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2024-01-01
  • Mysql InnoDB引擎中页目录和槽的查找过程

    Mysql InnoDB引擎中页目录和槽的查找过程

    这篇文章主要为大家介绍了Mysql InnoDB引擎中页目录和槽的查找记录过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 解说mysql之binlog日志以及利用binlog日志恢复数据的方法

    解说mysql之binlog日志以及利用binlog日志恢复数据的方法

    下面小编就为大家带来一篇解说mysql之binlog日志以及利用binlog日志恢复数据的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL事务隔离机制详解

    MySQL事务隔离机制详解

    在数据库中,事务是指一组逻辑操作,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位,这篇文章主要介绍了MySQL事务隔离机制,需要的朋友可以参考下
    2022-11-11
  • mysql+shardingSphere的分库分表实现示例

    mysql+shardingSphere的分库分表实现示例

    分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,本文主要介绍了mysql+shardingSphere的分库分表实现示例,具有一定的参考价值,感兴趣的可以
    2024-04-04
  • mysql查询FIND_IN_SET REGEXP实践示例

    mysql查询FIND_IN_SET REGEXP实践示例

    这篇文章主要为大家介绍了mysql查询FIND_IN_SET REGEXP实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Navicat连接不上MySQL的问题解决

    Navicat连接不上MySQL的问题解决

    最近遇到了一件非常棘手的问题,用Navicat远程连接数据库居然连接不到,真是头都大了,下面这篇文章主要给大家介绍了关于Navicat连接不上MySQL的问题解决,需要的朋友可以参考下
    2023-02-02
  • 你知道mysql中空值和null值的区别吗

    你知道mysql中空值和null值的区别吗

    这篇文章主要给大家介绍了关于mysql中空值和null值区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论