15、 实战:mysqldump改变字符集,实战,迁移数据(重点)

可以作为故障案例,用于面试

乱码-----字符集的问题

背景:公司业务数据book,由于之前建表没注意字符集的问题,导致之前写入的数据出现乱码。现在要将之前的数据和现在数据的字符集一致,不出现乱码情况,将字符集为latin1已有记录的数据转成utf8,并且已经存在的记录不乱码。

步骤

1:建库及建表的语句导出,sed批量修改为utf8

2:导出之前所有的数据

3:修改mysql服务端和客户端编码为utf8

4:删除原有的库表及数据

5:导入新的建库及建表语句

6:导入之前的数据

15.1、 准备实验环境

1、确保你的数据库默认字符集是utf8

修改/etc/my.cnf配置文件中character-set-server=utf8,重启mysql

[root@cong11 ~]# vim /etc/my.cnf
 character-set-server=utf8
 [root@cong11 ~]# systemctl restart mysqld

2、准备默认字符集是latin1的表文件

由于我们books表的字符集是utf8,删除book数据库,重新创建book数据库,导入字符集为latin1的sql文件book.sql

上传book<book_latin1.sql文件

[root@cong11 ~]# mysql -uroot -p123456 -e “drop database book;”
 [root@cong11 ~]# mysql -uroot -p123456 -e “create database book;”
 [root@cong11 ~]# mysql -uroot -p123456 book<book_latin1.sql

查看books表的字符集

[root@cong11 ~]# mysql -uroot -p123456 -e “show create table book.books;”

mysqldump变量密码特殊符号 mysqldump 字符集_数据


查看表内容

[root@cong11 ~]# mysql -uroot -p123456 -e “select * from book.books;”

15.1.1、 除了英文和时间,中文都是乱码

mysqldump变量密码特殊符号 mysqldump 字符集_数据_02


15.2、 导出数据表结构

[root@cong11 ~]# mysqldump -uroot -p123456 --default-character-set=latin1 -d book> booktable.sql

15.3、 编辑booktable.sql 将latin1修改成utf8

[root@cong11 ~]# vim booktable.sql

mysqldump变量密码特殊符号 mysqldump 字符集_sql_03


15.4、 确保数据库不再更新,导出所有数据

[root@cong11 ~]# mysqldump -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latin1 book>bookdata.sql

参数说明:

–quick:用于转储大的表,强制mysqldump从服务器一次一行的检索数据而不是检索所有行,否则内存压力大,并输出当前cache到内存中

–no-create-info:不要创建create table语句(不导出创建表的语句,因为之前的表默认是latin1字符集)

–extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,IO也小,导入数据时会非常快,(一次插入多行数据的语法)

–default-character-set=latin1:按照原有字符集导出数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码

15.5、 打开bookdata.sql 将SET NAME latin1 修改成SET NAME utf8

[root@cong11 ~]# vim bookdata.sql

mysqldump变量密码特殊符号 mysqldump 字符集_sql_04


15.6、 新建book2库

[root@cong11 ~]# mysql -e “create database book2 default charset utf8;” -uroot -p123456

15.7、 建立表,导入我们之前导出的表结构

[root@cong11 ~]# mysql -uroot -p123456 book2 <booktable.sql

15.8、 导入数据

[root@cong11 ~]# mysql -uroot -p123456 book2 <bookdata.sql

15.9、 查看结果

[root@cong11 ~]# mysql -uroot -p123456 -e"show create table book2.books;"

mysqldump变量密码特殊符号 mysqldump 字符集_数据_05


15.10、 查看表内容

[root@cong11 ~]# mysql -uroot -p123456 -e"select * from book2.books;"

mysqldump变量密码特殊符号 mysqldump 字符集_sql_06