使用MySQL MySqldump命令导出数据时的注意事项

   2015-09-05 0
核心提示:这篇文章主要介绍了使用MySQL MySqldump命令导出数据时的注意事项,很实用的经验总结,需要的朋友可以参考下

今天使用mysqldump命令备份数据的时候出现了一个问题。
一开始迁移 Discuz 7 论坛的 mysql 数据库时,采用 mysqldump 命令的时候一切顺利,但导入的时候却遇到了
 ERROR 1062 (xxxxx) at line 1262: Duplicate entry 'XXX' for key 'XXX‘ 错误,并停在原地。

对于遇到相同错误的朋友千万别第一时间就尝试用 –force 参数强行导入(除非你原来的数据库已经崩溃)。因为这样做的话,即使导入了,也会有一大片数据丢失!
这时候你可以尝试以下2个方法:

一、mysqldump 备份的时候使用 --extended-insert=false 参数。

原理如下:
使用MySqldump命令导出数据时的注意
在使用Mysql做基础数据库时,由于需要将库B的数据导入库A,而A,B库又包含大量相同的数据,需要使用mysqldump导出脚本.
通常的命令会是

mysqldump -t 'dbName' > 'scriptName.sql'
mysql -f 'dbName' < 'scriptName.sql'

而使用如下命令导入到A库时不会成功,现象是报出几个Duplicate key error后就完毕了,并未将其余正确的数据插入到A库中.
捣鼓了好一会,发现在使用mysqldump导出的脚本命令中,insert语句采用是multiline insert synax.而不是采用single insert synax.原来是这个问题. 多行的插入语法在第一个主健重复错误后就不执行后续的对应表的插入语句了.
于是再加参数 --extended-insert=false,完整的命令是

mysqldump --extended-insert=false dbname > scriptname.sql

二、手工把表中username里存在重复的值删除

使用数据库工具 Navicat 之类的,执行查询:

Select username,Count(*) From cdb_members Group By username Having Count(*) > 1

结果中就能显示出表中存在重复的字段, 你会看到2个或者多个完全一模一样重复的用户名。删除其中一行的记录,保存后再导出数据库。
这里需要特别注意:备份的时候,把表结构跟数据分开!

以下是 mysqldump 的一些使用参数

备份数据库:

#mysqldump 数据库名 >数据库备份名
#mysqldump -A -u用户名 -p密码 数据库名>数据库备份名
#mysqldump -d -A --add-drop-table -uroot -p >xxx.sql

1.导出结构不导出数据

mysqldump -d 数据库名 -uroot -p > xxx.sql

2.导出数据不导出结构

mysqldump -t 数据库名 -uroot -p > xxx.sql

3.导出数据和表结构

mysqldump 数据库名 -uroot -p > xxx.sql

4.导出特定表的结构

mysqldump -uroot -p -B数据库名 --table 表名 > xxx.sql
#mysqldump [OPTIONS] database [tables]

mysqldump支持下列选项:

--add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。

--add-drop-table
在每个create语句之前增加一个drop table。

--allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。

-c, --complete-insert
使用完整的insert语句(用列名字)。

-C, --compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。

--delayed
用INSERT DELAYED命令插入行。

-e, --extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)

-#, --debug[=option_string]
跟踪程序的使用(为了调试)。

--help
显示一条帮助消息并且退出。

--fields-terminated-by=...
 
--fields-enclosed-by=...
 
--fields-optionally-enclosed-by=...
 
--fields-escaped-by=...
 
--fields-terminated-by=...

这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。

-F, --flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。

-f, --force,
即使我们在一个表导出期间得到一个SQL错误,继续。

-h, --host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。

-l, --lock-tables.
为开始导出锁定所有表。

-t, --no-create-info
不写入表创建信息(CREATE TABLE语句)

-d, --no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!

--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。

-pyour_pass, --password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。

-P port_num, --port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)

-q, --quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。

-S /path/to/socket, --socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。

-T, --tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和--lines--xxx选项来定。

-u user_name, --user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。

-O var=option, --set-variable var=option设置一个变量的值。可能的变量被列在下面。

-v, --verbose
冗长模式。打印出程序所做的更多的信息。

-V, --version
打印版本信息并且退出。

-w, --where='where-condition'
只导出被选择了的记录;注意引号是强制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"

导入数据:

由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:

#mysql 数据库名 < 文件名
#source /tmp/xxx.sql
 
标签: MySQL MySqldump
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
    sql:mysql:函数:TIMESTAMPDIFF函数实现TimeS
     函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。//UPLOAD_TIME 减去 CREATE_DTTM 求得时间差,以分钟数计时select avg(TIMESTAMPDIFF(MINUTE,CREATE_DTTM,UPLOAD_TIME)) value,LEFT(CREATE_DTTM
    03-08
  • mysql下如何执行sql脚本 执行SQL脚本
    1.编写sql脚本,假设内容如下:  create database dearabao;  use dearabao;  create table niuzi (name varchar(20));  保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql2.执行sql脚本,可以有2种方法: 
    02-10
  • MySQL 5.7版本sql_mode=only_full_group_by问题
    用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'col_user_6.a.START_TIME' which is not functionally dependent on colu
    02-10
  • Oracle迁移到MySQL性能下降的注意点 oracle数据
    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的
    02-10
  • MySQL与Oracle 差异比较之六触发器
    触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u
    02-10
  • mysql where条件:某时间字段为今天的sql语句
    1.查询:注册时间为今天的所有用户数:select count(*) from customer where TO_DAYS(createtime) = TO_DAYS(NOW())2.获取当前时间到凌晨24点还有多长时间:(Java中可用于判断某时间是否为今天)final Calendar cal = Calendar.getInstance();    ca
    02-10
  • mysql中的sql
    变量用户变量: 在用户变量前加@系统变量: 在系统变量前加@@运算符算术运算符有: +(加), -(减), * (乘), / (除) 和% (求模) 五中运算位运算符有:(位于), | (位或), ^ (位异或), ~ (位取反),(位右移),(位左移)比较运算符有: = (等于),(大于),(小于), = (大
    02-10
  • mysql5.7配置文件修改sql_mode 重启无效解决方法。this is incompatible with sql_mode=only_full_group_by
    mysql5.7配置文件修改sql_mode 重启无效解决方
    whereis my.cnf找到配置路径:/etc/my.cnf找到[mysqld],在下面添加sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION重要:如果没有[mysqld],一定要先添加[mysqld]再在下
    02-10
  • mysql 8 查询报错(sql_mode=only_full_group_by)
    mysql 8 查询报错(sql_mode=only_full_group_by
    Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_
    02-10
  • Oracle、MySql、Sql Server比对
    MySql:廉价(部分免费):当前,MySQL採用双重授权(DualLicensed),他们是GPL和MySQLAB制定的商业许可协议。假设你在一个遵循GPL的***(开源)项目中使用MySQL,那么你能够遵循GPL协议免费使用MySQL。否则,你须要购买MySQLAB制定的那个商业许可协议。Windows $
    02-10
点击排行