mysqldump详细参数 mysql备份与回复

本文详细介绍了MySQL的多种备份方法,包括mysqldump、mysqlhotcopy、SQL语法备份等,并提供了具体的命令示例。

1、mysqldump
1.1 备份
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比

较合适,这也是最常用的备份方法。
现在来讲一下 mysqldump 的一些主要参数:

--compatible=name
它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、

mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、

no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。

--complete-insert,-c
导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是

可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。

--default-character-set=charset
指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项

,否则再次导入数据后将产生乱码问题。

--disable-keys
告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!

40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据

后才重建索引的。该选项只适合 MyISAM 表。

--extended-insert = true|false
默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为

false 即可。

--hex-blob
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、

VARBINARY、BLOB。

--lock-all-tables,-x
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关

闭 --single-transaction 和 --lock-tables 选项。

--lock-tables
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用

于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。

--no-create-info,-t
只导出数据,而不添加 CREATE TABLE 语句。

--no-data,-d
不导出任何数据,只导出数据库表结构。

--opt
这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys

--extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并

且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定

--quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。

--quick,-q
该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓

存到内存中。

--routines,-R
导出存储过程以及自定义函数。

--single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性

状态。它只适用于事务表,例如 InnoDB 和 BDB。
本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用 --quick 选项。

--triggers
同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。

其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表:

/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 来备份 Innodb 表:

/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,如果想要实现在线备份,还可以使用 --master-data 参数来实现,如下:

/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --master-data=1
--single-transaction --flush-logs db_name > db_name.sql
它只是在一开始的瞬间请求锁表,然后就刷新binlog了,而后在导出的文件中加入CHANGE MASTER 语句来指定当

前备份的binlog位置,如果要把这个文件恢复到slave里去,就可以采用这种方法来做。

1.2 还原
用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。

直接用 mysql 客户端
例如:

/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql

用 SOURCE 语法
其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:

SOURCE /tmp/db_name.sql;
这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。

2、 mysqlhotcopy
2.1 备份
mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp

来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件

、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类Unix 和

NetWare 系统上。

mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:

root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name./regex/ /tmp
更详细的使用方法请查看手册,或者调用下面的命令来查看 mysqlhotcopy 的帮助:

perldoc /usr/local/mysql/bin/mysqlhotcopy
注意,想要使用 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,并且还必须要能够有

读取 datadir/db_name 目录的权限。

2.2 还原
mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是

/usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:

root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)

3、 SQL 语法备份
3.1 备份
BACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文件。它能实现在线备份

,但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较

慢。
例子:

BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必须要有 FILE 权限才能执行本SQL,并且目录 /tmp/db_name/ 必须能被 mysqld 用户可写,导出的文件

不能覆盖已经存在的文件,以避免安全问题。

SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件,可以自定义字段间隔的方式,方便处理这些数据


例子:

SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必须要有 FILE 权限才能执行本SQL,并且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写

,导出的文件不能覆盖已经存在的文件,以避免安全问题。

3.2 恢复
用 BACKUP TABLE 方法备份出来的文件,可以运行 RESTORE TABLE 语句来恢复数据表。
例子:

RESTORE TABLE FROM '/tmp/db_name/';
权限要求类似上面所述。

用 SELECT INTO OUTFILE 方法备份出来的文件,可以运行 LOAD DATA INFILE 语句来恢复数据表。
例子:

LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
权限要求类似上面所述。倒入数据之前,数据表要已经存在才行。如果担心数据会发生重复,可以增加 REPLACE

关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。

4、 启用二进制日志(binlog)
采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。

启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 my.cnf,加入以下几行:

server-id = 1
log-bin = binlog
log-bin-index = binlog.index
然后启动 mysqld 就可以了。运行过程中会产生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 记

录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的信息请查看

手册。

需要备份时,可以先执行一下 SQL 语句,让 mysqld 终止对当前 binlog 的写入,就可以把文件直接备份,这样

的话就能达到增量备份的目的了:

FLUSH LOGS;如果是备份复制系统中的从服务器,还应该备份 master.info 和 relay-log.info 文件。

备份出来的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 来查看,如:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
该工具允许你显示指定的数据库下的所有 SQL 语句,并且还可以限定时间范围,相当的方便,详细的请查看手册

恢复时,可以采用类似以下语句来做到:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 输出的 SQL 语句直接作为输入来执行它。

如果你有空闲的机器,不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是那么高,因此成本低

,用低成本就能实现增量备份而且还能分担一部分数据查询压力,何乐而不为呢?

5、 直接备份数据文件
相较前几种方法,备份数据文件最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致

性,需要在靠背文件前,执行以下 SQL 语句:

FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不

会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。

注意,对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 表损坏时,就

可以依靠这些日志文件来恢复。

6、 备份策略
对于中等级别业务量的系统来说,备份策略可以这么定:第一次全量备份,每天一次增量备份,每周再做一次全

量备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份

,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制

(replication),在 slave 机器上做备份。

7、 数据维护和灾难恢复
作为一名DBA(我目前还不是,呵呵),最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此,需要

定期维护你的数据表。以下 SQL 语句就很有用:

CHECK TABLE 或 REPAIR TABLE,检查或维护 MyISAM 表
OPTIMIZE TABLE,优化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
当然了,上面这些命令起始都可以通过工具 myisamchk 来完成,在这里不作详述。

Innodb 表则可以通过执行以下语句来整理碎片,提高索引速度:

ALTER TABLE tbl_name ENGINE = Innodb;
这其实是一个 NULL 操作,表面上看什么也不做,实际上重新整理碎片了。

通常使用的 MyISAM 表可以用上面提到的恢复方法来完成。如果是索引坏了,可以用 myisamchk 工具来重建索引

。而对于 Innodb 表来说,就没这么直接了,因为它把所有的表都保存在一个表空间了。不过 Innodb 有一个检

查机制叫 模糊检查点,只要保存了日志文件,就能根据日志文件来修复错误。可以在 my.cnf 文件中,增加以下

参数,让 mysqld 在启动时自动检查日志文件:

innodb_force_recovery = 4
关于该参数的信息请查看手册。

 

 

转自http://toolkit1216.iteye.com/blog/1102732

<think>嗯,用户之前问了一个关于MySQL导入数据时遇到的GTID错误的问题,现在他们又想知道MySQL的常用命令。我需要确定用户的需求是什么。可能的情况是,他们刚开始使用MySQL,遇到了问题后想更全面地了解常用命令,以便更好地管理和操作数据库。 首先,我应该整理MySQL的常用命令,分门别类,比如数据库操作、表操作、数据操作、用户权限、备份恢复等。这样结构清晰,用户容易查找。用户之前在处理备份恢复时遇到了问题,可能需要更详细备份恢复命令,所以这部分可能需要重点说明。 然后,用户可能对基础命令和高级命令都有需求。比如基本的SELECT、INSERT、UPDATE、DELETE,还有JOIN、事务处理、索引管理等。此外,用户权限管理也是一个重要部分,特别是如果他们是在多用户环境或者需要设置权限的话。 还要考虑用户的使用场景。他们可能是开发人员、数据库管理员,或者是学生。根据不同的角色,常用命令可能有所不同。但作为通用介绍,应该覆盖大部分常见操作,确保内容全面。 另外,之前的回复中提到了GTID相关的命令,用户现在可能希望了解更广泛的命令,包括日常维护和监控。例如SHOW PROCESSLIST、EXPLAIN等,这些对于性能调优有帮助。 需要注意避免使用专业术语过多,或者如果使用的话,要简单解释。比如在介绍SHOW ENGINES时,可以简要说明存储引擎的作用,这样用户更容易理解。 还需要检查是否有遗漏的重要命令。比如创建用户、授权、撤销权限,这些在安全管理中很关键。备份和恢复命令,尤其是mysqldump的使用,之前用户已经接触过,可能需要更详细参数说明,比如--single-transaction适用于InnoDB的备份,避免锁表。 另外,考虑到用户可能是在命令行操作,所以示例中的命令应该包括如何在MySQL shell内执行,以及如何在shell外部使用命令行工具,比如mysqladmin。 最后,需要确保命令的正确性,比如语法是否正确,是否有常见的错误需要避免。例如,在修改表结构时,使用ALTER TABLE的正确语法,避免数据丢失。 可能还需要提醒用户注意某些命令的风险,比如DROP DATABASE或DELETE不带WHERE条件,这些操作不可逆,需要谨慎使用。 总结一下,我需要组织一个结构清晰、分类明确、覆盖常用操作的MySQL命令列表,并给出简明示例和注意事项,帮助用户快速掌握基本操作,同时覆盖他们可能需要的进阶内容,如备份恢复和性能监控。</think>--- ### MySQL 常用命令速查指南 MySQL 的命令主要分为 **数据库操作**、**表操作**、**数据操作**、**用户权限管理** 等类别。以下是分类整理的核心命令及示例: --- ### 一、数据库操作 1. **查看所有数据库** ```sql SHOW DATABASES; ``` 2. **创建数据库** ```sql CREATE DATABASE 数据库名; -- 示例:CREATE DATABASE mydb; ``` 3. **删除数据库** ```sql DROP DATABASE 数据库名; -- 示例:DROP DATABASE mydb; ``` 4. **切换数据库** ```sql USE 数据库名; -- 示例:USE mydb; ``` --- ### 二、表操作 1. **查看当前数据库所有表** ```sql SHOW TABLES; ``` 2. **创建表** ```sql CREATE TABLE 表名 ( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ... ); -- 示例:CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50)); ``` 3. **查看表结构** ```sql DESC 表名; -- 示例:DESC users; ``` 4. **删除表** ```sql DROP TABLE 表名; -- 示例:DROP TABLE users; ``` 5. **修改表结构** ```sql ALTER TABLE 表名 ADD 列名 数据类型; -- 添加列 ALTER TABLE 表名 DROP COLUMN 列名; -- 删除列 -- 示例:ALTER TABLE users ADD email VARCHAR(100); ``` --- ### 三、数据操作(CRUD) 1. **插入数据** ```sql INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...); -- 示例:INSERT INTO users (id, name) VALUES (1, 'Alice'); ``` 2. **查询数据** ```sql SELECT * FROM 表名; -- 查询所有数据 SELECT 列1, 列2 FROM 表名 WHERE 条件; -- 条件查询 -- 示例:SELECT name FROM users WHERE id = 1; ``` 3. **更新数据** ```sql UPDATE 表名 SET 列1=新值 WHERE 条件; -- 示例:UPDATE users SET name='Bob' WHERE id = 1; ``` 4. **删除数据** ```sql DELETE FROM 表名 WHERE 条件; -- 示例:DELETE FROM users WHERE id = 1; ``` --- ### 四、用户权限管理 1. **创建用户** ```sql CREATE USER '用户名'@'主机' IDENTIFIED BY '密码'; -- 示例:CREATE USER 'admin'@'localhost' IDENTIFIED BY '123456'; ``` 2. **授权** ```sql GRANT 权限 ON 数据库.表 TO '用户'@'主机'; -- 示例:GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'localhost'; ``` 3. **撤销权限** ```sql REVOKE 权限 ON 数据库.表 FROM '用户'@'主机'; -- 示例:REVOKE DELETE ON mydb.* FROM 'admin'@'localhost'; ``` 4. **刷新权限** ```sql FLUSH PRIVILEGES; ``` --- ### 五、备份恢复 1. **备份数据库** ```bash mysqldump -u 用户名 -p 数据库名 > 备份文件.sql -- 示例:mysqldump -u root -p mydb > mydb_backup.sql ``` 2. **恢复数据库** ```bash mysql -u 用户名 -p 数据库名 < 备份文件.sql -- 示例:mysql -u root -p mydb < mydb_backup.sql ``` 3. **仅备份表结构** ```bash mysqldump -u 用户名 -p --no-data 数据库名 > 结构备份.sql ``` --- ### 六、高级操作 1. **事务控制** ```sql START TRANSACTION; -- 开启事务 COMMIT; -- 提交事务 ROLLBACK; -- 回滚事务 ``` 2. **查看进程终止查询** ```sql SHOW PROCESSLIST; -- 查看当前连接进程 KILL 进程ID; -- 终止指定进程 -- 示例:KILL 15; ``` 3. **索引管理** ```sql CREATE INDEX 索引名 ON 表名 (列名); -- 创建索引 DROP INDEX 索引名 ON 表名; -- 删除索引 -- 示例:CREATE INDEX idx_name ON users (name); ``` --- ### 七、系统状态配置 1. **查看 MySQL 版本** ```sql SELECT VERSION(); ``` 2. **查看系统变量** ```sql SHOW VARIABLES LIKE '变量名'; -- 示例:SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; ``` 3. **查看运行状态** ```sql SHOW STATUS LIKE '变量名'; -- 示例:SHOW STATUS LIKE 'Threads_connected'; ``` --- ### 八、实用技巧 1. **模糊查询** ```sql SELECT * FROM 表名 WHERE 列名 LIKE '%关键词%'; -- 示例:SELECT * FROM users WHERE name LIKE '%John%'; ``` 2. **分页查询** ```sql SELECT * FROM 表名 LIMIT 偏移量, 数量; -- 示例:SELECT * FROM users LIMIT 10, 20; -- 跳过前10条,取20条 ``` 3. **去重查询** ```sql SELECT DISTINCT 列名 FROM 表名; -- 示例:SELECT DISTINCT name FROM users; ``` --- ### 注意事项 1. **删除操作需谨慎** - `DROP` 和 `DELETE` 命令会永久删除数据,操作前建议备份。 2. **权限最小化原则** - 避免直接授予 `ALL PRIVILEGES`,按需分配权限。 3. **事务一致性** - 涉及多步操作时使用事务(如转账),确保数据完整性。 --- 通过掌握这些命令,可以高效完成 MySQL 的日常操作。实际使用时,建议结合 `EXPLAIN` 分析查询性能,并定期备份数据!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值