五個(gè)改mysql數(shù)據(jù)庫(kù)名的方法:
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括伊寧網(wǎng)站建設(shè)、伊寧網(wǎng)站制作、伊寧網(wǎng)頁(yè)制作以及伊寧網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,伊寧網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到伊寧省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1.
RENAME
DATABASE
db_name
TO
new_db_name
這個(gè)。。這個(gè)語(yǔ)法在mysql
5.1.7中被添加進(jìn)來(lái),到了5.1.23又去掉了。據(jù)說(shuō)有可能丟失數(shù)據(jù)。還是不要用的好。詳見(jiàn):
2.如果所有表都是MyISAM類(lèi)型的話,可以改文件夾的名字
關(guān)閉mysqld
把data目錄中的db_name目錄重命名為new_db_name
開(kāi)啟mysqld
3.重命名所有的表
CREATE
DATABASE
new_db_name;
RENAME
TABLE
db_name.table1
TO
new_db_name.table1,
db_name.table2
TO
new_db_name.table2;
DROP
DATABASE
db_name;
4.
mysqldump導(dǎo)出數(shù)據(jù)再導(dǎo)入
mysqldump
-uxxxx
-pxxxx
-h
xxxx
db_name
db_name_dump.SQL
mysql
-uxxxx
-pxxxx
-h
xxxx
-e
“CREATE
DATABASE
new_db_name”
mysql
-uxxxx
-pxxxx
-h
xxxx
new_db_name
db_name_dump.SQL
mysql
-uxxxx
-pxxxx
-h
xxxx
-e
“DROP
DATABASE
db_name”
5.使用Shell腳本重命名所有的表
#!/bin/bash
mysqlconn=”mysql
-u
xxxx
-pxxxx
-S
/var/lib/mysql/mysql.sock
-h
localhost”
olddb=”db_name”
newdb=”new_db_name”
#$mysqlconn
-e
“CREATE
DATABASE
$newdb”
params=$($mysqlconn
-N
-e
“SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
table_schema=’$olddb’”)
for
name
in
$params;
do
$mysqlconn
-e
“RENAME
TABLE
$olddb.$name
to
$newdb.$name”;
done;
#$mysqlconn
-e
“DROP
DATABASE
$olddb”
就是方法3的優(yōu)化版。
提供三種方法:
1. RENAME DATABASE db_name TO new_db_name
這個(gè)。。這個(gè)語(yǔ)法在mysql 5.1.7中被添加進(jìn)來(lái),到了5.1.23又去掉了。
據(jù)說(shuō)有可能丟失數(shù)據(jù)。還是不要用的好。
2.如果所有表都是MyISAM類(lèi)型的話,可以改文件夾的名字
關(guān)閉mysqld
把data目錄中的db_name目錄重命名為new_db_name
開(kāi)啟mysqld
3.重命名所有的表
CREATE DATABASE new_db_name;
RENAME TABLE db_name.table1 TO new_db_name.table1,
db_name.table2 TO new_db_name.table2;
DROP DATABASE db_name;
今天接到宇航同學(xué)的問(wèn)題,他們老大要求更改數(shù)據(jù)庫(kù)名稱(chēng),居然是為了數(shù)據(jù)庫(kù)安全???我靠!真強(qiáng)的想法啊。因?yàn)樗麄兊臄?shù)據(jù)庫(kù)是采用的INNODB存儲(chǔ)引擎,不能直接修改數(shù)據(jù)庫(kù)的名稱(chēng),所以現(xiàn)轉(zhuǎn)換成MyISAM存儲(chǔ)引擎在修改表名在轉(zhuǎn)換成INNODB存儲(chǔ)引擎就好了,雖然過(guò)程比較麻煩,不如修改表名那樣容易,但是能修改就偷笑吧。我個(gè)人認(rèn)為數(shù)據(jù)庫(kù)的名稱(chēng)屬于數(shù)據(jù)庫(kù)設(shè)計(jì)范疇,應(yīng)該遵守設(shè)計(jì)規(guī)范,不能隨便的修改名稱(chēng)。第一次聽(tīng)說(shuō)為了安全修改數(shù)據(jù)庫(kù)名,實(shí)在是不可取。修改名稱(chēng)詳細(xì)步驟(因?yàn)椴粌H僅是上面那幾步)mysql use dinghao;mysql select * from t1;+——+———–+| id | name |+——+———–+| 1 | 劉德華 | +——+———–+1 row in set (0.00 sec)mysql show create table t1;+——-+————————————————————————————————————————-+| Table | Create Table |+——-+————————————————————————————————————————-+| t1 | CREATE TABLE `t1` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +——-+————————————————————————————————————————-+1 row in set (0.00 sec)mysql flush tables;Query OK, 0 rows affected (0.00 sec)mysql flush logs;Query OK, 0 rows affected (0.00 sec)mysql show processlist; #這一步主要查看有沒(méi)有其他進(jìn)程連接,要保證沒(méi)有其他程序操作數(shù)據(jù)庫(kù)。+—-+——+———–+———+———+——-+——-+——————+| Id | User | Host | db | Command | Time | State | Info |+—-+——+———–+———+———+——-+——-+——————+| 17 | root | localhost | dinghao | Query | 0 | NULL | show processlist | +—-+——+———–+———+———+——-+——-+——————+1 rows in set (0.00 sec)mysql alter table t1 engine=MyISAM;Query OK, 1 row affected (0.01 sec)Records: 1 Duplicates: 0 Warnings: 0mysql exit[root@mysqludf var]# mv dinghao aaa;mysql use aaa;Database changedmysql alter table t1 engine=INNODB;Query OK, 1 row affected (0.00 sec)Records: 1 Duplicates: 0 Warnings: 0mysql select * from t1;+——+———–+| id | name |+——+———–+| 1 | 劉德華 | 站長(zhǎng)教學(xué)網(wǎng) eduyo.com+——+———–+1 row in set (0.00 sec)注意,在改名之前必須現(xiàn)轉(zhuǎn)換存儲(chǔ)引擎,否則會(huì)報(bào)錯(cuò),你想換的這個(gè)名稱(chēng)就換不成了,只能換另外一個(gè)名稱(chēng)了。錯(cuò)誤的方法就不演示了,光記住好的就行了。
最安全的做法是進(jìn)入到mysql安裝目錄,修改庫(kù)名。
比如是默認(rèn)安裝的,那么位置在/var/lib/mysql/目錄下;目錄下的所有目錄都是庫(kù)名,直接用mv更改就可以;
提示: 如果進(jìn)入mysql用命令改會(huì)發(fā)生未知錯(cuò)誤的,而且新版本也不支持這種改法了!
MySQL在5.1引入了一個(gè)rename
database操作,但在MySQL5.1.23后又不支持這個(gè)命令。可以說(shuō)是一個(gè)實(shí)驗(yàn)性的功能,沒(méi)有在生產(chǎn)中支持過(guò)(mysql-5.1
release在mysql-5.1.30),那么生產(chǎn)中我們有時(shí)為了追求完美需要改一下庫(kù)名。怎么操作呢?
這里提供一個(gè)變通的方法。
1.
創(chuàng)建出新庫(kù)名:
復(fù)制代碼
代碼如下:
mysqlcreate
database
db_v2;
2.生成rename語(yǔ)句,從olddb里遷移,我這里olddb里sbtest;
復(fù)制代碼
代碼如下:mysqlselect
concat("rename
table
",table_schema,".",table_name,"
to
db_v2.",table_name,";")
into
outfile
'/tmp/rename_to_db_v2.sql'
from
information_schema.tables
where
table_schema='sbtest';
3.執(zhí)行生成的sql
復(fù)制代碼
代碼如下:mysqlsource
/tmp/rename_to_db_v2.sql
就這么簡(jiǎn)單可以搞定了。
Good
luck!
被取消的命令MySQL 之前提供了一個(gè) rename database db_old to db_new 的命令來(lái)直接對(duì)數(shù)據(jù)庫(kù)改名,可能由于實(shí)現(xiàn)的功能不完備(比如,這條命令可能是一個(gè)超大的事務(wù),或者是由于之前的表很多還是 MyISAM 等),后來(lái)的版本直接取消了這條命令。更改數(shù)據(jù)庫(kù)名大致上有以下幾種方案:
一、mysqldump 導(dǎo)入導(dǎo)出要說(shuō)最簡(jiǎn)單的方法,就是直接用 mysqldump 工具,在舊庫(kù)導(dǎo)出再往新庫(kù)導(dǎo)入(最原始、最慢、最容易想到)的方法:舊庫(kù) yttdb_old 導(dǎo)出(包含的對(duì)象:表、視圖、觸發(fā)器、事件、存儲(chǔ)過(guò)程、存儲(chǔ)函數(shù))
二、改整庫(kù)的表名利用 MySQL 更改表名的方法來(lái)批量把舊庫(kù)的所有表依次遍歷,改名為新庫(kù)的表。這種方法比第一種要快很多倍,但是沒(méi)有第一步操作起來(lái)那么順滑,不能一步到位。比如,要把數(shù)據(jù)庫(kù) yttdb_old 改名為 yttdb_new,如果數(shù)據(jù)庫(kù) yttdb_old 里只有磁盤(pán)表,那很簡(jiǎn)單,直接改名即可?;蛘邔?xiě)個(gè)腳本來(lái)批量改,非常簡(jiǎn)單。但是一般舊庫(kù)里不只有磁盤(pán)表,還包含其他各種對(duì)象。這時(shí)候可以先考慮把舊庫(kù)的各種對(duì)象導(dǎo)出來(lái),完了在逐一改完表名后導(dǎo)進(jìn)去。
三、歷史方案其實(shí)在 MySQL 早期還有一種方法。假設(shè) MySQL 部署好了后,所有的 binlog 都有備份,并且二進(jìn)制日志格式還是 statement 的話,那就可以簡(jiǎn)單搭建一臺(tái)從機(jī),讓它慢慢追主機(jī)到新的庫(kù)名,等確切要更改舊庫(kù)的時(shí)候,再直接晉升從機(jī)為主機(jī)即可。這里只需要從機(jī)配置一個(gè)參數(shù)來(lái)把舊庫(kù)指向?yàn)樾聨?kù):replicate-rewrite-db=yttdb_old-yttdb_new不過(guò)這種局限性很大,不具備標(biāo)準(zhǔn)化,不推薦。
總結(jié)其實(shí)針對(duì) MySQL 本身改庫(kù)名,大致就這么幾種方法:
如果數(shù)據(jù)量小,推薦第一種;
數(shù)據(jù)量大,則推薦第二種;
數(shù)據(jù)量巨大,那就非 MySQL 本身能解決的了。
可通過(guò)部署第三方 ETL 工具,通過(guò)解析 MySQL 二進(jìn)制日志或其他的方式來(lái)把舊庫(kù)數(shù)據(jù)直接讀取到新庫(kù)達(dá)到改名的目的等等。