将mysql数据迁移到群晖NAS
情况和问题
原本大量的金融数据保存在电脑本地硬盘的mysql数据库中,随着数据量越来越大,电脑的硬盘吃紧,正好把我的群晖NAS升级到了DS923+并且增加了4T的存储空间,可以使用Docker安装mysql并且存储空间不再是个问题,因此打算将电脑中的数据全部迁移到群晖NAS中。
这里记录的方法可以用来将电脑本地mysql数据库中的数据转移到群晖NAS中。
前提条件
- 本地电脑上运行一个mysql server,并存有大量数据
- 群晖NAS中已经安装好mysql
- 在mysql中创建好一个空数据库,并且已经可以通过局域网或外网远程访问
- 群晖NAS中启用了SSH服务(如果使用第二种方法,需要这个条件)
在群晖NAS中安装mysql需要用到Docker(现在已经更名为Container Manager,但实质是一回事),关于在群晖NAS中安装mysql,请参考另一片文件,这里不赘述。
方法1,使用管道方式传递数据
使用mysqldump命令在本地terminal中可以直接传递数据到远程数据库:
mysqldump -u user -pPassword db_name table_name [table_name] | mysql -u user -pPassword -h host db_name
# 如果在命令行中直接输入密码,密码与'-p'之间不要留空格
示例如下,如果要将本地数据传至192.168.0.5的远程服务器上:
mysqldump -u jackie -p test_db index_daily | mysql -u jackie -p -h 192.168.0.5 test_db
这种方法胜在简单容易,但是如果传输数据量大,这种方法速度相当慢,而且随着数据量增大,速度是越来越慢的,导致耗时呈指数级上升,如果一张数据表的数据量达到千万行级别,数据表占用空间达到1GB以上,迁移耗时会达到数小时甚至几十小时。此时建议采用方法二:
方法2,导出数据为文件,复制到NAS上再导入
使用下面命令导出数据表为本地文件:
mysqldump -u user -p db_name table_name > file_name.sql
例如
mysqldump -u jackie -p test_db index_daily > index_daily.sql
导出文件后将文件复制到NAS,然后使用以下命令通过ssh登录NAS的命令行:
ssh user@host_ip -p port
其中port是在群晖NAS上开启的SSH服务端口,host_ip是群晖NAS的局域网IP,例如:
ssh jackie@192.168.0.5 -p 22
进入群晖NAS的命令行模式后,就能看到复制过来的sql文件了。但这个文件现在在NAS本地路径下,而mysql是在docker容器中运行的,我们还必须把NAS本地路径下的sql文件复制到docker容器路径中,才能使用它。使用下面的命令将文件复制过去(注意必须使用sudo权限):
sudo docker cp file_path_name container_id:target_path_name
例如,将文件index_daily从群晖NAS本地路径复制到id为mysql的容器中:
sudo docker cp /index_daily.sql mysql:/
接下来,就可以进入容器,查看文件是否存在,使用下面命令进入容器:
sudo docker exec -it container_id bash
例如:
sudo docker exec -it mysql bash
在容器中确认文件存在后,使用下面命令导入数据:
mysql -u user -p db_name < file_name.sql
例如,将刚才导出的文件导入数据库:
mysql -u jackie -p test_db < index_daily.sql
通过上面命令,将数据导入数据库