前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql服务器间迁移

Mysql服务器间迁移

作者头像
码客说
发布2019-10-22 17:00:13
2.3K0
发布2019-10-22 17:00:13
举报
文章被收录于专栏:码客码客

准备配置

代码语言:javascript
复制
set global max_allowed_packet=300000000;
set global net_buffer_length=300000;
set global interactive_timeout=35900000;
set global wait_timeout=35900000;

查看数据库各表大小

代码语言:javascript
复制
SELECT table_name, data_length + index_length AS len, table_rows,
     CONCAT(ROUND((data_length + index_length)/1024/1024,2),'MB') AS size,table_comment
FROM information_schema.tables
WHERE table_schema = 'xhkjedu_question'
ORDER BY len DESC;

导出数据

导出数据库

代码语言:javascript
复制
mysqldump -u root -p123456 testdb > /data/db/testdb.sql

导出一个表

代码语言:javascript
复制
mysqldump -u root -p123456 testdb tablename> dbname_users.sql

服务器间复制

从本地复制到远程

复制单个文件

代码语言:javascript
复制
scp /data/db/testdb.sql root@111.111.111.111:/data/db/testdb.sql

复制目录

代码语言:javascript
复制
scp -r /data/db/* root@111.111.111.111:/data/db/

导入数据

方式一

可以显示导入过程

登录

代码语言:javascript
复制
mysql -uroot -p

回车输入密码

创建数据库导入

代码语言:javascript
复制
create database testdb;
use testdb;
set names utf8;
source testdb.sql

方式二

无法显示导入过程

导入数据库

代码语言:javascript
复制
mysql -u root -p 123456 testdb < "/data/db/testdb.sql"

以CSV导入导出

导入过程中出现的问题

  • Invalid utf8 character string: ‘’ 数据库表非utf8编码的修改为utf8编码
  • Can’t connect to local MySQL server through socket ‘/data/mysql/mysql.sock’ (111) 导入时不要进行数据库操作

1. 导出与导入表结构

导出原数据库表结构

代码语言:javascript
复制
mysqldump -d -uroot -p12345678 xhkj_ques_0923 > xhkj_ques_0923_base.sql

新库导入表结构

代码语言:javascript
复制
mysql -u root -p
mysql> create database xhkj_ques_0924;
mysql> use xhkj_ques_0924;
mysql> set names utf8;
mysql> source xhkj_ques_0923_base.sql
mysql> quit

2. 导出表数据

1) 删除之前导出的文件

代码语言:javascript
复制
rm -rf /var/lib/mysql-files/*.csv
ls /var/lib/mysql-files/

2) 把数据库所有表表名保存到tables.txt

代码语言:javascript
复制
select table_name from information_schema.tables where table_schema='xhkj_ques_0923' and table_type='base table';

注意文件的最后一行要有一个空行 否则无法导入最后一个表

3) 导出数据

Linux环境

创建 mysql_export.sh文件

代码语言:javascript
复制
#!/bin/bash
while read line
do
echo "======> export $line"
mysql -uroot -p12345678 xhkj_ques_0923 -e "SELECT * INTO OUTFILE '/var/lib/mysql-files/$line.csv' FIELDS TERMINATED BY ',' FROM $line"
done < tables.txt

执行

代码语言:javascript
复制
chmod +x mysql_export.sh
sh ./mysql_export.sh

Win环境

代码语言:javascript
复制
@echo off & setlocal enabledelayedexpansion

for /f %%i in (tables.txt) do ( set table=%%i
echo "======> !table!"
mysql -uroot -p12345678 xhkj_ques_0923 -e "SELECT * INTO OUTFILE 'F:/MySQL/Uploads/!table!.csv' FIELDS TERMINATED BY ',' FROM !table!"
)
pause

3. 导入表数据

1) 暂时禁用外键检查

代码语言:javascript
复制
SET GLOBAL FOREIGN_KEY_CHECKS = 0;

或者删除外键

代码语言:javascript
复制
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,' ;') 
FROM information_schema.TABLE_CONSTRAINTS c 
WHERE c.TABLE_SCHEMA='库名' AND c.CONSTRAINT_TYPE='FOREIGN KEY';

然后运行生成的SQL

2) 导入数据

Linux环境

创建mysql_import.sh文件

代码语言:javascript
复制
#!/bin/bash
while read line
do
echo "======> import $line"
mysql -uroot -p12345678 xhkj_ques_0924 -e "LOAD DATA INFILE '/var/lib/mysql-files/$line.csv' INTO TABLE $line FIELDS TERMINATED BY ','"
done < tables.txt

执行

代码语言:javascript
复制
chmod +x mysql_import.sh
sh ./mysql_import.sh

3) 导入后启用外键检查

代码语言:javascript
复制
SET GLOBAL FOREIGN_KEY_CHECKS = 1;

4. 常见错误

The MySQL server is running with the –secure-file-priv option

查看可导入的文件夹

代码语言:javascript
复制
show variables LIKE '%secure_file_priv%';

NULL 表示限制mysql 不允许导入或者导出

修改mysql配置文件/etc/my.cnfmy.ini,在[mysqld]下添加

代码语言:javascript
复制
# secure_file_priv的值没有具体值时,mysqld的导入或导出不限制文件目录
secure_file_priv =

或者

代码语言:javascript
复制
# 限制mysqld 的导入或导出只能在指定目录下
secure_file_priv = 指定目录

重启mysql,再次查看

数据导入之前需在新机器上创建表结构,12G的数据导出用时3分钟左右,导入用时4分钟左右

查看数据行数

方式一 (精确)

生成查询各表条数的SQL

代码语言:javascript
复制
select concat(
    'select "',
    TABLE_name,
    '", count(*) from ',
    TABLE_SCHEMA,
    '.',
    TABLE_name,
    ' union '
) from information_schema.tables
where TABLE_SCHEMA='testdb';

把查询出来的结果整体复制后 删除最后一个union 整体全选运行即可

方式二 (不精确)

对于InnoDB表,table_rows行计数仅是大概估计值,所以结果并不精确

查看各表数据行数(按表名排序)

代码语言:javascript
复制
use information_schema;
select table_name,table_rows from tables
where TABLE_SCHEMA = 'testdb'
order by table_name asc;

查看各表数据行数(按数据条数排序)

代码语言:javascript
复制
use information_schema;
select table_name,table_rows from tables
where TABLE_SCHEMA = 'testdb'
order by table_rows desc;

查看总条数

代码语言:javascript
复制
USE information_schema;
SELECT SUM(TABLE_ROWS) FROM TABLES WHERE TABLE_SCHEMA = 'testdb';

常见错误

导入失败

Error 2020: Got packet bigger than ‘max_allowed_packet’ bytes when dumping table

打开配置文件

代码语言:javascript
复制
vi /etc/my.cnf

添加如下

代码语言:javascript
复制
[mysqldump] 
max_allowed_packet = 1G
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备配置
  • 查看数据库各表大小
  • 导出数据
  • 服务器间复制
  • 导入数据
    • 方式一
      • 方式二
      • 以CSV导入导出
        • 1. 导出与导入表结构
          • 2. 导出表数据
            • 3. 导入表数据
              • 4. 常见错误
              • 查看数据行数
                • 方式一 (精确)
                  • 方式二 (不精确)
                  • 常见错误
                  相关产品与服务
                  云数据库 SQL Server
                  腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档