最近在做一个数据库迁移,把做了的东西mark以下。
发现不管是大数据量还是小数据量,其实流程大致遵循上面的流程其实就差不多了,只不过在大数据量下可能2和3要做一次脚本才行。
1. 锁表
如果贵项目是允许数据错误的话其实锁不锁都可以,不过最好在迁移数据的时候加上个只读锁,防止数据错乱。(另外千万不要断开连接,如果断开连接则表锁自然释放)1
2
3
4
5
6// 全局加只读锁(软件上的所有库表)
FLUSH TABLES WITH READ LOCK;
// 指定表加只读锁
LOCK TABLES [表名] READ;
// 建议使用下面的,全局加锁成本太高
2. 导出数据
如果数据量过大,如突破千万级,此处可以跟第3步合起来,写个脚本可能更好一些。但如果数据量不至于大到压垮CPU和内存(其实不到千万级都还好)。可以采取以下方式:mysqldump -h [原数据库IP地址] -u [原数据库用户名] -p [表名] > ./[文件]
如果数据量过大,机器性能耗不过的话,也可以分块导出,最后合并一起或者拆表
3. 导入数据库
mysql -h [新数据库IP地址] -u [新数据库用户名] -p [表名] < ./[文件]
a. 如果数据量过大,机器性能耗不过的话,还可以尝试去除索引,在导入完成之后再添加(因为其实索引加了之后会在查询上会很快,反之,其伴随的就是插入慢,因为插入时是要在记录上建立索引的;同时索引极占空间)
b. 关于主从下的 MyISAM和innodb,最好选MyISAM:
对MyISAM引擎:
(1)对master服务器进行 ‘load’ 操作,
(2)在master上所操作的load.txt文件,会同步传输到slave上,并在tmp_dir 目录下生成 load.txt文件
master服务器插入了多少,就传给slave多少
(3)当master上的load操作完成后,传给slave的文件也结束时,
即:在slave上生成完整的 load.txt文件
此时,slave才开始从 load.txt 读取数据,并将数据插入到本地的表中
对innodb引擎:
(1)主数据库进行 ‘Load’ 操作
(2)主数据库操作完成后,才开始向slave传输 load.txt文件,
slave接受文件,并在 tmp_dir 目录下生成 load.txt 文件
接受并生成完整的load.txt 后,才开始读取该文件,并将数据插入到本地表中
4. 添加新的授权用户
(无论如何,程序一般都需要权限降级的,否则一旦被黑,可能会影响到其他同在一个软件下的数据)GRANT all PRIVILEGES on [库名].* to [账号]@'10.247.%' identified by '[密码]'
5. 解除锁定表
UNLOCK TABLES;
最后,如果真的是极大的表迁移,最好还是老老实实使用脚本或者借助第三方工具,似乎HeidiSQL还不错?MSSQL2MYSQL ?Navicat?有很多种解决方式的。