美文网首页
mysql5.6数据迁移mysqldump

mysql5.6数据迁移mysqldump

作者: 三个程序员之一 | 来源:发表于2023-03-27 22:18 被阅读0次
--no-create-db,  ---取消创建数据库sql(默认存在)
--no-create-info,---取消创建表sql(默认存在)
--no-data         ---不导出数据(默认导出)
--add-drop-database ---增加删除数据库sql(默认不存在)
--skip-add-drop-table  ---取消每个数据表创建之前添加drop数据表语句(默认每个表之前存在drop语句)
--skip-add-locks       ---取消在每个表导出之前增加LOCK TABLES(默认存在锁)
--skip-comments        ---注释信息(默认存在)
数据库导出语句

这是以压缩包的形式导出
这个命令在导出的时候会加锁数据库是不能修改的
./mysqldump  -uroot -P3306 -p你的密码  -h你的ip --no-create-info 你的数据库名字 | gzip > /home/nomarkor.sql.gz
文章开头是可以添加的命令像我只导数据就加了--no-create-info

如果你是dump本地的把-h去掉就会连接本地库
导入语句
数据库名字需要提前创建
gunzip < /home/nomarkor.sql.gz | ./mysql -uroot -p你的密码 数据库名字

我在导入的时候遇到了
Specified key was too long; max key length is 767 bytes
Index was too long; max key length is 767 bytes
我是5.7数据导入5.6数据库
然后百度找解决方案
往上说需要查看当前被导入的数据库的
1)show variables like '%innodb_large_prefix%';
2)show variables like '%innodb_file_format%';
看看第一个结果是不是on 
第二个结果是不是Barracuda
如果不是 下面语句可以设置
set global innodb_large_prefix=on;
set global innodb_file_format=Barracuda;
我不是很清楚是否需要重启数据库所以我直接把配置问价加到了my.cnf里面了

我看百度上写说5.6数据库 是写成1 ,5.7以上把等于1写成on
innodb_large_prefix=1
innodb_file_per_table=1
innodb_file_format=BARRACUDA


然后我执行gunzip < /home/nomarkor.sql.gz | ./mysql -uroot -p你的密码 数据库名字
发现还是报错然后其实还有一个条件就是数据库表的行格式必须是ROW_FORMAT为DYNAMIC或COMPRESSED
怎么看呢就是看看原来数据库随便打开一个表点设计表,如下图
image.png
举例
-- 建表时增加ROW_FORMAT=DYNAMIC属性
create table tb_name(
    ...
)ENGINE = INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

-- 如果是已经建好的表,则可以修改表
alter table tb_name ROW_FORMAT=DYNAMIC;

我的是因为mysqldump导出的sql表结构不带这个行格式然后执行创建的时候就不是DYNAMIC
所以导致不满足行格式所以导入还是失败
我有三个思路就是第一导出的时候sql创建表结构带上这个ROW_FORMAT=DYNAMIC (这个写到创建表sql 引擎后面)但是不知道怎么配置
第二就是给目标数据库设置默认值创建的时候如果不写就默认是DYNAMIC
第三就是我先导结构到目标库  手动把所有的建表语句全局替换成 添加ROW_FORMAT=DYNAMIC

然后在导入这样的话mysqldump的时候就不要导出结构了所以我加了--no-create-info不要结构只要数据

这是改成行格式的第二套方案
可以通过下面语句做全局的搜索不满足的行格式然后批量修改

注意别瞎执行 如果你只想查查就
SELECT
    *
FROM
    information_schema.TABLES 
WHERE
    table_schema IN ( '数据库名' ) AND information_schema.TABLES.row_format <> 'Dynamic'

如果改的话只想下面这个语句
SELECT
    CONCAT( "ALTER TABLE `", table_schema, "`.`", table_name, "` ROW_FORMAT =DYNAMIC ;" ) 
FROM
    information_schema.TABLES 
WHERE
    table_schema IN ( '数据库名' ) AND information_schema.TABLES.row_format <> 'Dynamic'
我按照这个逻辑最终解决了这个问题
下面在准备几个mysqldump的语法

相关文章

网友评论

      本文标题:mysql5.6数据迁移mysqldump

      本文链接:https://www.haomeiwen.com/subject/ixqmldtx.html