mysql修改i数据库名_重命名MySQL数据库

那么有两种方法:

方法1:一种众所周知的重命名数据库模式的方法是使用Mysqldump转储模式并在另一个模式中恢复它,然后删除旧模式(如果需要)。

来自method 2

mysqldump emp > emp.out

mysql -e "CREATE DATABASE employees;"

mysql employees < emp.out

mysql -e "DROP DATABASE emp;"

尽管上述方法容易,但是耗费时间和空间。 如果架构超过100GB怎么办? 有些方法可以将上述命令组合在一起以节省空间,但不会节省时间。

为了解决这种情况,还有另一种快速重命名方法   但是,在执行此操作时必须小心。

方法2:MySQL具有非常好的功能,可以重命名甚至适用于不同模式的表。 这个重命名操作是原子的,没有其他人可以在重命名时访问该表。 这需要很短的时间才能完成,因为更改表的名称或其架构只是元数据更改。 这是重命名的程序方法:

使用所需名称创建新数据库模式。

使用MySQL将表从旧模式重命名为新模式“RENAME TABLE”命令。

删除旧的数据库架构。

如果架构中有method 2,那么也需要重新创建。 如果表上存在触发器,MySQL的“RENAME TABLE”将失败。 为了解决这个问题,我们可以做以下事情:

1)method 2使用-E,-R标志(除了-t -d之外)     将触发器转储到mysqldump命令。 一旦触发器     对于RENAME TABLE,我们需要从模式中删除它们     命令工作。

$ mysqldump -d -t -R -E > stored_routines_triggers_events.out

2)生成仅“BASE”表的列表。 这些可以使用a找到     查询information_schema.TABLES表。

mysql> select TABLE_NAME from information_schema.tables where

table_schema='' and TABLE_TYPE='BASE TABLE';

3)将视图转储到out文件中。 可以使用查询找到视图     相同的information_schema.TABLES表。

mysql> select TABLE_NAME from information_schema.tables where

table_schema='' and TABLE_TYPE='VIEW';

$ mysqldump … > views.out

4)删除old_schema中当前表的触发器。

mysql> DROP TRIGGER ;

...

5)重命名步骤#2中找到的所有“Base”表后,恢复上述转储文件。

mysql> RENAME TABLE .table_name TO .table_name;

...

$ mysql < views.out

$ mysql < stored_routines_triggers_events.out

上述方法的复杂性:我们可能需要为用户更新method 2,使其与正确的schema_name匹配。 这些可以通过简单的UPDATE mysql.columns_priv,mysql.procs_priv,mysql.tables_priv修复,mysql.db表更新old_schema name到new_schema并调用“Flush privileges;”。虽然“method 2”似乎比“method 1”复杂一点,但这完全可以编写脚本。 一个简单的bash脚本以正确的顺序执行上述步骤,可以帮助您在下次重命名数据库模式时节省空间和时间。

Percona远程DBA团队编写了一个名为“rename_db”的脚本,其工作方式如下:

[root@dba~]# /tmp/rename_db

rename_db

为了演示此脚本的使用,使用了示例模式“emp”,在该模式上创建了测试触发器和存储例程。 将尝试使用脚本重命名数据库模式,这需要几秒钟才能完成,而不是耗时的转储/恢复方法。

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| emp |

| mysql |

| performance_schema |

| test |

+--------------------+

[root@dba ~]# time /tmp/rename_db localhost emp emp_test

create database emp_test DEFAULT CHARACTER SET latin1

drop trigger salary_trigger

rename table emp.__emp_new to emp_test.__emp_new

rename table emp._emp_new to emp_test._emp_new

rename table emp.departments to emp_test.departments

rename table emp.dept to emp_test.dept

rename table emp.dept_emp to emp_test.dept_emp

rename table emp.dept_manager to emp_test.dept_manager

rename table emp.emp to emp_test.emp

rename table emp.employees to emp_test.employees

rename table emp.salaries_temp to emp_test.salaries_temp

rename table emp.titles to emp_test.titles

loading views

loading triggers, routines and events

Dropping database emp

real 0m0.643s

user 0m0.053s

sys 0m0.131s

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| emp_test |

| mysql |

| performance_schema |

| test |

+--------------------+

正如您在上面的输出中所看到的,数据库模式“emp”在不到一秒的时间内被重命名为“emp_test”。最后,这是来自Percona的脚本,上面用于“method 2”。

#!/bin/bash

# Copyright 2013 Percona LLC and/or its affiliates

set -e

if [ -z "$3" ]; then

echo "rename_db "

exit 1

fi

db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`

if [ -n "$db_exists" ]; then

echo "ERROR: New database already exists $3"

exit 1

fi

TIMESTAMP=`date +%s`

character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`

TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`

STATUS=$?

if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then

echo "Error retrieving tables from $2"

exit 1

fi

echo "create database $3 DEFAULT CHARACTER SET $character_set"

mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"

TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`

VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`

if [ -n "$VIEWS" ]; then

mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump

fi

mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump

for TRIGGER in $TRIGGERS; do

echo "drop trigger $TRIGGER"

mysql -h $1 $2 -e "drop trigger $TRIGGER"

done

for TABLE in $TABLES; do

echo "rename table $2.$TABLE to $3.$TABLE"

mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"

done

if [ -n "$VIEWS" ]; then

echo "loading views"

mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump

fi

echo "loading triggers, routines and events"

mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump

TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`

if [ -z "$TABLES" ]; then

echo "Dropping database $2"

mysql -h $1 $2 -e "drop database $2"

fi

if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then

COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"

fi

if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then

PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"

fi

if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then

TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"

fi

if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then

DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';"

fi

if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then

echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"

if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi

if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi

if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi

if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi

echo " flush privileges;"

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值