MYSQL数据库迁移总结
Auth: Jin
Date: 2014-04-03
前端操作,后续测试对外开放不在本文
准备阶段
操作阶段
后续阶段
需求:
phpcms和anquanzuo在一个mysql实例中
anquanzuo有一张视图为phpcms三张表部分字段的字段和组合
phpcms迁移到master-slave的mmm架构
anquanzuo迁移到ndb架构
一、准备阶段
信息采集和权限授予
(一)phpcms
1.字符集
环境字符集
3304-phpcms>show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
一般情况下应该是utf8
表字符集,注意不是默认字符集的情况
3304-phpcms> show table status where Collation!='utf8_general_ci';
比如latin1_swedish_ci的情况
Article_Article | InnoDB | 10 | Compact | 24303 | 3045 | 74022912 | 0 | 409600 | 6291456 | NULL | 2013-05-10 17:50:03 | NULL | NULL | latin1_swedish_ci | NULL | | |
2.存储引擎
3304-phpcms> show table status where Engine!='MyISAM';
+-----------------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+-----------------------------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+-----------------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+-----------------------------------+
| v9_npostchannel | InnoDB | 10 | Compact | 13 | 1260 | 16384 | 0 | 0 | 1012924416 | 23 | 2012-07-19 16:58:09 | NULL | NULL | latin1_swedish_ci | NULL | | |
| v9_npostdata | InnoDB | 10 | Compact | 33697 | 451 | 15220736 | 0 | 0 | 1012924416 | 33518 | 2013-11-19 16:55:38 | NULL | NULL | latin1_swedish_ci | NULL | | |
| v9_npostinfo | InnoDB | 10 | Compact | 129 | 127 | 16384 | 0 | 0 | 1012924416 | 154 | 2013-11-19 15:15:35 | NULL | NULL | latin1_swedish_ci | NULL | | |
| v9_npostinfo_20131119 | InnoDB | 10 | Compact | 101 | 162 | 16384 | 0 | 0 | 1012924416 | 108 | 2013-11-19 15:15:35 | NULL | NULL | latin1_swedish_ci | NULL | | |
| v9_router | InnoDB | 10 | Compact | 39 | 420 | 16384 | 0 | 16384 | 1012924416 | 361 | 2014-03-20 18:08:23 | NULL | NULL | utf8_general_ci | NULL | | 路由规则表 |
| v9_session | MEMORY | 10 | Fixed | 12 | 1096 | 8384880 | 129491304 | 378048 | 129328 | NULL | NULL | NULL | NULL | utf8_general_ci | NULL | | |
| v9_sso_session | MEMORY | 10 | Fixed | 0 | 1096 | 0 | 129491304 | 0 | 0 | NULL | NULL | NULL | NULL | utf8_general_ci | NULL | | |
| v9_times | MEMORY | 10 | Fixed | 6 | 172 | 8384640 | 120236600 | 1118480 | 172 | NULL | NULL | NULL | NULL | utf8_general_ci | NULL | | |
+-----------------------+--------+---------+------------+-------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+-----------------------------------+
8 rows in set (0.02 sec)
master-slave结构中MyISAM不同步,InnoDB,MEMORY可以同步(后发现线上MyISAM也同步,这个再做测试确认一下)
ndb中MyISAM,InnoDB,MEMORY都不会同步,都必须转换为ndbcluster
确认需要把库中所有MyISAM转换为InnoDB,MEMORY保持不变。
3.索引
mysql-client没有一条语句可以查看所有的索引(我目前不知道),可以写shell全部查看
vim getindex.sh
MYSQLBIN=/usr/local/mysql/bin/mysql
IP=192.168.201.121
PORT=3304
USER=root
PASSWD=password
DB=phpcms
TABS=`${MYSQLBIN} -h${IP} -P${PORT} -u${USER} -p${PASSWD} ${DB} -e"show tables\G"|grep -v row|awk '{print $2}'`
for TAB in ${TABS};do
${MYSQLBIN} -h${IP} -P${PORT} -u${USER} -p${PASSWD} ${DB} -e"show index from ${TAB};"
done
因源数据存储引擎为MyISAM,迁移后要修改为InnoDB
InnoDB 不支持FULLTEXT字段索引
sh getindex.sh |grep FULL
v9_search 1 data 1 data NULL 33231 NULL NULL FULLTEXT
v9_search_keyword 1 data 1 data NULL NULL NULL NULL FULLTEXT
这两个表的索引,是迁移时需要修改的。
4、存储过程
3304-phpcms>show PROCEDURE status;
Empty set (0.00 sec)
mysqldump -R参数
5、Trigger
3304-phpcms>SELECT TRIGGER_NAME FROM information_schema.`TRIGGERS` where TRIGGER_SCHEMA='phpcms';
+----------------+
| TRIGGER_NAME |
+----------------+
| article_insert |
| article_update |
| article_delete |
+----------------+
和开发确认已经没有使用,无需修改
6、视图
show table status where Comment='view';
视图和普通表一样,导出时没特殊的参数,但需要有了解
(二)anquanzuo
按前面的步骤准备
3304-anquanzuo>show table status where comment='view';
+------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
| carseats_article | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | VIEW |
+------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+--
主要要处理的是这个视图
二、操作阶段
(一)phpcms
放入mmm
1、导出
jump 217
cd /opt/backup
mysqldump -h 192.168.201.121 -P3304 -u dbproxy -ppassword phpcms > /opt/backup/phpcms-mmm_20140331.sql
cp /opt/backup/phpcms-mmm_20140331.sql /opt/backup/phpcms-mmm_20140331_bak.sql
2、修改存储引擎
sed -i s/MyISAM/InnoDB/ /opt/backup/phpcms-mmm_20140331.sql
3、删除FULLTEXT索引
CREATE TABLE `v9_search` (
`searchid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`typeid` smallint(5) unsigned NOT NULL DEFAULT '0',
`id` mediumint(8) unsigned NOT NULL DEFAULT '0',
`adddate` int(10) unsigned NOT NULL,
`data` text NOT NULL,
`siteid` smallint(5) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`searchid`),
KEY `typeid` (`typeid`,`id`),
KEY `siteid` (`siteid`),--删除,
FULLTEXT KEY `data` (`data`) --删除部分
) ENGINE=InnoDB AUTO_INCREMENT=33705 DEFAULT CHARSET=utf
CREATE TABLE `v9_search_keyword` (
`keyword` char(20) NOT NULL,
`pinyin` char(20) NOT NULL,
`searchnums` int(10) unsigned NOT NULL,
`data` char(20) NOT NULL,
UNIQUE KEY `keyword` (`keyword`),
UNIQUE KEY `pinyin` (`pinyin`), --删除,
FULLTEXT KEY `data` (`data`) --删除部分
) ENGINE=InnoDB DEFAULT CHARSET=utf8
注意不能
sed -i /FULLTEX/d /opt/backup/phpcms-mmm_20140331.sql
这样删除还多了一个,号
4、导入目标mysql-master
mysql -h 127.0.0.1 -P 3304 -u root -ppassword
create database phpcms;
use phpcms
source /opt/backup/phpcms-mmm_20140331.sql
5.slave确认
jump 2
mysql -h 127.0.0.1 -P 3304 -u root -ppassword phpcms
确认表数量,拉一个表内容看看。
(二)anquanzuo
操作部分见
httpp://www.cnblogs.com/diege/p/3548445.html
实际在千兆内网中的远程表查询速度也非常慢,接近一分钟了。
远程表是三个表的组合的视图,没有索引。所以,最终这个库没有到NDB上,还是phpcms一个实例
三、后续阶段
1.修改备份源
2.修改phpmyadmin源
总结:
(一)必须了解迁移的数据库的情况,以及目标环境的特性,比如架构,存储引擎等
1、架构,是单点还是master-slave或者是NDB,是否使用mysql-proxy以及其他技术,了解这个技术的特性和限制
2、迁移前需要了解字符集,存储引擎(和复制索引有关),索引,存储过程,触发器,视图。
(二)明确知道各种变化的处理
1、Charset & Collation
字符集的变化
比如,源库环境是utf8但是表和表数据是latin1
show table status where Collation!='utf8_general_ci';
解决办法:
导出时加原来的字符集而不是默认的utf8
mysqldump --default-character-set=latin1 -h 192.168.201.102 -P3308 -udbproxy -ppasswd vcity > ./vcity.sql
导入时修改client的字符集为原来数据的字符集
mysql -h127.0.0.1 -P3307 -uroot -ppasswd --default-character-set=latin1 vcity < ./vcity.sql
或者
mysql -h127.0.0.1 -P3307 -uroot -ppasswd
create database vcity
SET NAMES latin1
use vcity;
source ./vcity.sql
注:使用source较快
2、Engine 存储引擎的变化
必须新架构为M-S或者NDB,需要支持该架构复制的存储应请
M-S
sed -i s/MyISAM/InnoDB/ dbname.sql
NDB
sed -i s/MyISAM/ndbcluster/ dbname.sql
sed -i s/InnoDB/ndbcluster/ dbname.sql
3、Index 索引
比如MyISAM变化为InnoDB要删除FULLTEXT字段的索引
4、Procedure 存储过程
有存储,mysqldump需要加-R参数
5、Trigger 触发器
目前不知道在dump如何导出
6、View 视图
迁移时和普通表一样,只是要注意试图的数据是当前库还是当前实例的其他库,如果是前实例的其他库,那需要其他库已经存在
MYSQL数据库迁移总结的更多相关文章
- MySQL数据库迁移(转)
MySQL数据库迁移(数据文件直接迁移) 在今年10月下旬的时候,公司的服务器需要迁移,其中涉及到了MySQL数据库迁移.查看了一下MySQL数据文件的大小,接近60G的大小(实际数据并没用那么多). ...
- mysql数据库迁移到oracle数据库后 如何删除相同的数据
mysql数据库迁移到oracle数据库后 如何删除相同的数据 首先搞清楚有多少数据是重复的 select pid from product group by pid having count(pid ...
- django2.0+连接mysql数据库迁移时候报错
django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...
- MySQL数据库迁移与MySQL数据库批量恢复
目录 一.MySQL数据库迁移或备份 1. 了解使用InnoDB引擎创建数据库所产生的文件 2. 迁移数据库步骤 1. 从A服务器迁移至B服务器 2. MySQL重装并导入之前数据库 二.MySQL数 ...
- MySQL数据库迁移详细步骤(转)
========================================================================================== 一.背景简介 == ...
- EF6 Codefirst+MySql 数据库迁移
简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 Visual Studio 2013 MySQL 5.7 ...
- Centos MySQL数据库迁移详细步骤
其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库, 但是这次数据文件过大,大约有40个G,使用命令行导入,效果不是很好,经常在执行过程中报错.卡死 ...
- mysql数据库迁移文档
数据库迁移文档 一.需求 确保数据库稳定的运行,为开发人员提供方便的测试数据库和生产数据库的环境. 二.数据库整体架构(master/slave) 1.slave数据库安装 rpm -Uvh http ...
- MySql数据库迁移图文展示
MySql数据库的数据从一台服务器迁移到另外一台服务器需要将数据库导出,再从另外一台服务器导入.方法有很多,MySql配套的相关工具都有这个功能.phpMyAdmin就可以做,但是这个加载起来慢,推荐 ...
- MYSQL数据库迁移到ORACLE数据库
一.环境和需求1.环境 MySQL数据库服务器: OS version:Linux 5.3 for 64 bit mysql Server version: 5.0.45 Oracle数据库服务器: ...
随机推荐
- 简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环)
简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环) http://www.cnblogs.com/M18-BlankBox/p/5881700.html
- 一个朋友 js图表开发问题 用 c和 js 解决
引言 不求知道一切, 只求发现一件 -- 乔治·西蒙·欧姆 附注:那些存在于梦幻中的事迹,那些儿时梦中的人物,每每看起,都觉得 .哎 .... 岁月 ... 一直在努力 ... ...
- [收集]关于MSSQL数据库的一些查询
sqlserver快速查找所有存储过程中是否包含某字符 --将XXXX替换成你要查找的内容 select name from sysobjects o, syscomments s where o.i ...
- mui框架 页面无法滚动解决方法
只需要初始化一下就可以了 mui.init(); 加下面这段代码即可: (function($){ $(".mui-scroll-wrapper").scroll({ //boun ...
- 关于进度管理工具Gantt图
关于进度管理工具Gantt图 18.以下关于进度管理工具图的叙述中,不正确的是( D). A.能清晰地表达每个任务的开始时间.结束时间和持续时间 B.能清晰地表达任务之间的并行关系 C.不能清晰地确定 ...
- hibernate连接Oracle rac
连接方式与普通的数据库不一样.connection.url 中使用了LOAD-BALANCE = yes 要不然会报错 <hibernate-configuration> <sess ...
- 51Nod 1022 石子归并 V2(区间DP+四边形优化)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...
- 用谷歌浏览器Chrome浏览jQuery Mobile页面需要配置Tomcat服务器
在浏览jQuery Mobile 页面中,除了 Chrome浏览器出错外,其他的浏览器都ok: 这里,是因为需要单独配置 Tomcat 服务: 1.先配置java jdk: 2.下载,安装,配置,To ...
- 洛谷P1886滑动窗口
题目传送门 理解题意:给定一个数列和窗口范围k,求依次向右移动窗口时每次窗口内的最大和最小值. 没什么思维难度,一边扫过去,用两个数组maxx和minn记录每个窗口内的最大最小值,移动过程中用两个变量 ...
- 按照grouip分组,之后分组调用生成正式凭证 的接口
按照grouip分组,之后分组调用生成正式凭证 的接口 Map<String, List<OperatingLogVO>> resultMap = new HashMap< ...