找回密码
 注册
查看: 3161|回复: 1

MySQL数据库修改库名的三种方法

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-6-15 03:00:16 | 显示全部楼层 |阅读模式
如果是Innodb完全不行,会提示相关表不存在。
  G% d9 }) }0 ^第一种方法:/ s9 W% g4 u$ @+ }0 ~
RENAME database olddbname TO newdbname( z& k+ N5 F6 B4 w
官方不推荐,会有丢失数据的危险
: Z6 ]; {3 `+ g' R- t+ ~
这个语法在mysql 5.1.7中被添加进来,到了5.1.23又去掉了。

' u: b6 v8 l% N. c$ h$ ^0 w
第二种方法:

) ?/ K7 K' z* Q
如果所有表都是MyISAM类型的话,可以改文件夹的名字5 J# A4 a9 ]$ m5 W( l2 o1 U' F  k% m
关闭mysqld

" v3 G! _  N- u" U% D
service mysqld stop
, D! h9 l+ M4 C7 M: \Shutting down MySQL SUCCESS! # }1 y6 q+ A# e# C: b+ R
把data目录中的db_name目录重命名为new_db_name
& V8 N3 x( ~; A, h' g: \
# cd /var/lib/mysql
3 L- }4 b8 i. f# _5 F/ f
修改成新的数据库名称:

$ P. O" B+ c6 p7 `
# mv sichuan/ Sichuan

5 F  a1 O6 f" s$ u8 g5 R8 F

1 u( S, C! B+ z# s: H, w  r开启mysqld
0 U, R3 z. W# B
service mysqld start
/ ?$ h. v2 Z3 DStarting MySQL SUCCESS!

( @9 K9 L" F  Q! ~! H
; i( R1 F- a: j7 D& k2 e8 |0 ]! f" Z

2 l* ]" F) @8 H, E# V7 u3 Z1 tmysql> show databases;
4 S1 Q0 r4 p+ d5 v0 n+--------------------+4 l9 v7 v2 G* S! C
| Database           |8 h7 M4 Q) T4 i' h- ~; S
+--------------------+
' u5 b! ?! s8 V5 n$ k& V| information_schema |   r. Q% L3 `! B1 A4 E
| Sichuan            | 3 k% l7 j8 ]; r1 |9 W, m4 G
| mysql              |
. @! [; E( D+ w* e; E| test               | 2 x5 [# O: O/ {/ e/ U$ C! M% o+ \
| yang               |
% F' O2 h, S! K8 J+--------------------+
4 Q" y  R! w+ p: ^& @: {; S5 rows in set (0.00 sec)
; G" @: v7 f& R第三种方法:: F" |* n" T! i/ E$ H
mysqldump导出数据再导入" v' _3 z. [4 E& |- h
+ Y' d& S; T" N+ S" B' n
1.创建需要改成新名的数据库。
) Q. u7 _, L! w% q# c; L( Tmysql> create database Sichuan;0 }  c& h9 c0 B- x5 U
Query OK, 1 row affected (0.00 sec): f% n1 z4 W2 o# x& h1 ]) `( }
; q, b! J) E3 e+ o$ @
2.mysqldum 导出要改名的数据库, C- X) n$ X/ h+ F- [+ N
mysqldump -uroot -p123456 sichuan >/root/sichuan.sql
" P/ h5 @/ f  L1 [( }+ k- I导入数据到新建的数据库中:
( h! q; p) A2 f. y# mysql -uroot -p123456 Sichuan <sichuan.sql   或者:mysql> source /root/sichuan.sql" p4 l- N0 c3 _1 ?5 q
3.删除原来的旧库(确定是否真的需要)
5 o+ ?: N2 }, ~. |- V) a3 r$ [
! k; Z2 K. `& b: J" t! K1 y0 O8 L当然这种方法虽然安全,但是如果数据量大,会比较耗时,同时还需要考虑到磁盘空间等硬件成本。
5 D+ L9 L3 @( ^# ~6 E( |% k% }( }8 M: `, {
mysqldump -uxxxx -pxxxx -h xxxx db_name > db_name_dump.SQL
* t7 I' S9 q5 [& x% P! y
mysql -uxxxx -pxxxx -h xxxx -e “CREATE DATABASE new_db_name”

- ^. O  S& l' r0 o) N. \5 n' }  F- B
mysql -uxxxx -pxxxx -h xxxx new_db_name < db_name_dump.SQL
2 N( f6 a1 R+ v; o) z2 p! t
mysql -uxxxx -pxxxx -h xxxx -e “DROP DATABASE db_name”

; m) j' |6 l/ A9 b  i* r+ e$ E) q& n1 N' T

3 p2 S, ^+ p% t2 u' T第四种方法:$ C8 L, E7 x* S! n. g9 E! g
直接跑一个shell脚本,
3 ^( R" h+ i3 N1 O/ C2 Z! N5 i#!/bin/bash6 r3 m1 X- c% G( g1 l1 q, F
# 假设将db1数据库名改为db2
. X6 t4 I9 s1 s- ]7 U# MyISAM直接更改数据库目录下的文件即可4 D- M# g5 g. [  X  B$ r5 r
mysql -uroot -p123456 -e 'create database if not exists db2'2 P, ?; b9 I3 w2 A$ u5 C
list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='db1'")- X9 u" v0 s. O9 C; b4 e  u
for table in $list_table
3 n1 e" k# l" Q2 g" Odo( ?4 J+ {9 B& h' M; J# u/ O8 K# j5 z: k
    mysql -uroot -p123456 -e "rename table db1.$table to db2.$table"( _# t( I* s; N, J" M9 m; \# e# d
done
9 R5 t6 x9 p1 l) b' [+ [
, V- a, W9 b+ B$ f6 v3 u
) t1 p* s, I* @7 v( _8 A; X9 ^#!/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”5 z; s4 V( r9 s& q7 e, o, Z
0 h! j: k& f( D8 g7 U) O; u$ A

. ~' y: j* T5 o7 g% Y0 C9 t% M( w
注:以上这些操作都是危险的,所以请在执行操作前,备份你的数据库!!

# t, `7 a: Q5 P% E  Z  x: p————————————————6 q0 A2 e$ y9 a
: n6 h4 Q# g% `+ u; b$ I

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-6-15 03:00:17 | 显示全部楼层
第一步:查看存储引擎
' W! u; p$ N/ E; r执行SHOW ENGINES\G指令可列表查看,MySQL 5.6可用的存储引擎有9种(除最后的FEDERATED以外,其他8种都支持),其中默认采用的存储引擎为InnoDB
5 V; @8 e: S6 r. e, N0 t5 H6 \2 h4 G
步骤二:查看默认存储类型
1 ~- i1 E8 v/ ~; r3 K查看系统变量default_storage_engine 的值,确认默认采用的存储引擎是InnoDB% Z4 J/ Y3 G/ w

4 i5 r( n. n. V6 `) V( g: I, emysql> SHOW VARIABLES LIKE 'default_storage_engine';
! u: x& K, u3 C' r( V# w
. f  F  P3 u; v' j  {
) h: v2 u6 c0 j3 K" X, u: n步骤三:修改默认存储引擎2 C& p( n. T2 J/ S: U  z$ M
Innodb存储引擎的修改方法
# [- m! d  \- X0 [方法一:
, i; E. _$ R6 F5 m6 t% n8 C步骤一,使用mysqldump进行逻辑备份! G  h  t% l# w2 m6 j- Z8 D* t

' [9 G/ t. X! ?" N2 V$ ~  |4 R8 T2 m9 S1)备份MySQL服务器上的所有库
" \. X6 P/ l/ n9 ~! w2 V# P; F! }; y2 E% {7 Y- {: G( _  _
将所有的库备份为mysql-all.sql文件:8 G) Y, v. T9 j; ^$ L. [  c% E
5 E4 k7 x7 u. r) c0 z
[root@dbsvr1 ~]# mysqldump -u root -p --all-databases > /root/alldb.sql
0 V6 M- R  X' k8 P1 sEnter password:                                 //验证口令
  u0 l* {: D6 `( A) f[root@dbsvr1 mysql]# file /root/alldb.sql         //确认备份文件类型
( j1 o4 U* ^, A) o- a& @. {: B2)只备份指定的某一个库$ ]' k* @6 M/ v3 O

; t' m: I- `/ j7 P将userdb库备份为userdb.sql文件:) e- t, y: y" E2 a1 x, |' s2 K2 X; V
8 G% Z5 S0 I6 G7 Y
[root@dbsvr1 ~]# mysqldump -u root -p userdb > userdb.sql
7 B2 e7 w0 p$ l( z' WEnter password:                                 //验证口令! J+ d! x) ~, P6 i3 v+ Z! m+ K
3)同时备份指定的多个库
. X% P( @4 H5 i. n0 G7 I, j6 ?& ?" \- ^4 U) g) _1 Y
同时备份mysql、userdb库,保存为mysql+userdb.sql文件:4 y8 g4 z7 Z  k7 U+ h) s
+ r8 k$ S$ t  T) H8 ^% \
[root@dbsvr1 ~]# mysqldump -u root -p -B mysql userdb > mysql+test+userdb.sql
# ^& L; {0 ]4 H; QEnter password:                                 //验证口令; B0 ]8 d- E! F3 U
步骤二:使用mysql命令从备份中恢复数据库、表
0 r  ~  Z8 H3 ~# A1 a2 n9 U( S5 |6 p3 X! ~& ^8 M
以恢复userdb库为例,可参考下列操作。通常不建议直接覆盖旧库,而是采用建立新库并导入逻辑备份的方式执行恢复,待新库正常后即可废弃或删除旧库。
$ `8 d- U/ T) a3 f% {. [$ W. `
; }2 j2 c  T) b- O' j7 C( g8 {0 g1)创建名为userdb2的新库
5 d- q. W0 e: ~& S/ k; H1 e4 k( z1 g. G1 K
mysql> CREATE DATABASE userdb2;8 p7 n. s6 G0 f3 T( L4 D8 r
Query OK, 1 row affected (0.00 sec)
. q9 u1 {3 Q' {) qmysql> CREATE DATABASE userdb2;
+ j+ J1 A1 _6 t  ~Query OK, 1 row affected (0.00 sec)- c, f& `  T' q+ M$ `! J2 G+ u* a
2)导入备份文件,在新库中重建表及数据: |4 F/ h& h" |! E2 N' N+ J) _/ N

& S2 Z1 o3 O# E6 r1 M[root@dbsvr1 ~]# mysql -u root -p userdb2 < /root/userdb.sql
' ?: g7 C6 `9 j/ E7 g- KEnter password:                                 //验证口令# Q( ~2 Y' m3 a  A. U
[root@dbsvr1 ~]# mysql -u root -p userdb2 < /root/userdb.sql
# D" j# c4 Y" e- g4 nEnter password:                                                                  //验证口令
) q0 X; ]% d5 C* k1 r6 S' C3)确认新库正常,启用新库: m% [7 m" G/ C  \  l7 u

' c/ S! [0 h# Vmysql> USE userdb2;                             //切换到新库. F3 s- m7 b2 ]( f- R
mysql> SELECT sn,username,uid,gid,homedir         //查询数据,确认可用
; x2 D, O2 m* X' b6 h-> FROM userlist LIMIT 10;
" t! f3 Q4 |- l5 R) y) s' [7 W4)废弃或删除旧库$ ^+ j6 M  K  t
* O! X% N$ O2 r) M: N
mysql> DROP DATABASE userdb;) r. z& l9 Z' n
方法二:7 s' Q* h9 v, \7 b1 b, b
1,使用脚本修改8 G: n/ X# n; D0 p7 f& f  K* Q
9 ?3 {5 u4 w8 |  [- R7 S8 i9 H2 @
# vim /tmp/mv-mysql-databses.sh
- B* ^! t" C1 ^0 I3 k' a; M' P8 V3 ~
9 A& a* y) [) \! s+ }: V0 p9 I& [#!/bin/bash
7 h( l" j$ W- @# Y# 我的在Innodb下用这种方法) {% O5 k! \' H1 u5 a8 @. c2 q+ a
# 假设将yct数据库名改为jingcaiwang  U2 _+ j; Y5 j0 c
# MyISAM那么可以直接去到数据库目录mv就可以9 p# Z( k1 A' o% Y; |1 n
# MyISAM直接更改数据库目录下的文件即可  ^! l/ F7 m: x( [7 ]1 g. q

5 I" Q; |% Q5 j# [0 g0 L: emysql -uroot -p123456 -e 'create database if not exists jingcaiwang'
7 C) @9 D# v1 I2 G! h0 ilist_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='yct'")# l: Q+ O, G" |' a$ ^7 Q

8 ~$ V* z+ H  gfor table in $list_table
" `0 _% N! y6 I  |do
6 g& C& [9 p5 Q    mysql -uroot -p123456 -e "rename table yct.$table to jingcaiwang.$table"
/ I$ K1 q( ^; Q. n3 A  c: hdone/ e# o/ x. U" m' v+ [
7 u/ T- ], u( Q/ J+ m) }' I

5 z: k, d, ^' T, Q2,执行脚本
' r& }/ j  Q5 {4 j, P2 @
, U1 D. o5 C4 k# E+ `#   sh mv-mysql-databses.sh
+ J1 `2 {. A2 {, h3 O/ ~& r" Y/ v4 J% E5 H) E' }* F, P# Z1 x

% D, p5 ?3 |/ b" a5 y
) C; n3 o' t( r3 [3,查询,确认结果
- A5 p7 H) w$ r: g6 `6 x0 l% i: W
  t+ A7 B7 d# h2 nmysql>  show tables jingcaiwang;5 U3 k3 k0 j+ C
" A1 q+ v+ z( E3 W: K
方法三:
1 {* l: y& m3 N5 o& ]5 Q
: Y; N. D' ?( e; Z/ A, |( ~使用binlog日志1 [8 q* t  v( I3 a/ D" T# w

# o. S0 w! |$ l* V/ q见其他章节!!!
1 E# \* i' g; T4 d- \, O4 d# N9 |4 Z
3 U1 _+ |1 ~; \7 ]1 h; n2 k
  }" y! ?0 V; I0 X/ L
注意:若数据库都使用MyISAM存储引擎,可以采用冷备份的方式,直接复制对应的数据库目录即可;恢复时重新复制回来就行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:18 , Processed in 0.016797 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表