首页 > 代码库 > 某次数据迁移简记

某次数据迁移简记

数据迁移,倒腾了好几天,全因当初库恶心的设计--库未设置编码,同一个库表的编码还不一致。

哎~给别人擦屁股真不是件好事。


## 安装mysql

## 如果mysql无法导入gb2312编码的数据,可能因为安装时执行./configure 编译时未指定gb2312选项,

## 参见:http://blog.chinaunix.net/uid-20494084-id-3232230.html

[root@server1 ~]# ./configure  --prefix=/usr/local/mysql/   --with-extra-charsets=all 
  --with-charset=gb2312  --with-charset=gbk  --with-charset=utf8


## 冷备及冷恢复

## 如果库非常大,则可以考虑复制库文件(目录)
## 冷备前,最好关闭mysql服务
[root@server1 ~]# service mysqld stop 
或
[root@server1 ~]# /usr/local/mysql/support-files/mysql.server stop
## 库保存在$mysql/data或my.cnf的datadir指定位置
## 用tar压缩后,库体积能缩小不少
[root@server1 ~]# cp -r analysedb /usr/local/mysql/data
## 复制完成后,需要修改库文件拥有者,否则mysql会报权限错误
[root@server1 ~]# chown -R mysql.mysql /usr/local/mysql/data/analysedb


## 创建库时指定编码

mysql> CREATE DATABASE IF NOT EXISTS `yourdb` DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
或
mysql> CREATE DATABASE `yourdb` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;


## --hex-blob 如果导出数据时有二进制(blob),则需要加--hex-blob

## --default-character-set=gbk如果你的库编码与mysql不一致,最好指定一下

## -B 导出库结构。如果mysql与库编码不一致,最好指定在CREATE DATABASE语句上指定下编码

[root@server1 ~]# ./mysqldump -uroot -p123456 -B --hex-blob --default-character-set=gbk analysedb > /tmp/analysedb.gbk.sql


## 如果库中的表,编码不一致,则最好按编码分别导出

[root@server1 ~]# ./mysqldump -uroot -p123456 --hex-blob --default-character-set=gbk analysedb t_user t_monitor > /tmp/analysedb.part.gbk.sql
或
[root@server1 ~]# ./mysqldump -uroot -p123456 --hex-blob --default-character-set=utf8 analysedb t_user t_monitor > /tmp/analysedb.part.utf8.sql


## my.cnf配置

## max_allowed_packet: 如果要导入数据量比较大,最好修改此选项

## character-set-server=utf8: 如果不指定此项,则mysql默认字符集采用latin1(也就是iso8859-1)

[client]
default-character-set=utf8
port = 3307
socket = /var/run/mysqld/mysql-slave.sock
[mysqld]
character-set-server=utf8
port = 3307
datadir = /data/3307/data
socket = /var/run/mysqld/mysql-slave.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 16M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
max_connections=5000
server_id=100
log-bin=mysql-bin-100
binlog-ignore-db=mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
relay_log_recovery = 1
binlog_format=mixed
skip-name-resolve
skip-external-locking
log_slave_updates = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set=utf8
no-auto-rehash


## 显示创建表结构信息

mysql> SHOW CREATE TABLE `analysedb`.`t_user`;


## 修改表信息

mysql> ALTER TABLE `analysedb`.`t_user` DEFAULT CHARSET=utf8;

## 修改字段信息

mysql> ALTER TABLE `analysedb`.`t_user`  CHANGE COLUMN `username` `username` varchar(128) CHARACTER SET utf8 NULL DEFAULT NULL;


## 显示指定库的表信息

mysql> use information_schema;
mysql> select table_name from tables where table_schema=‘analysedb‘ order by table_collation,table_name;


## 导入数据

mysql> source /tmp/analysedb.part.utf8.sql
mysql> source /tmp/analysedb.part.gbk.sql


某次数据迁移简记