--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
怎么看呢就是看看原来数据库随便打开一个表点设计表,如下图
![](https://img.haomeiwen.com/i13239217/c443d05ffbe9dc58.png)
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的语法
网友评论