mysqldump 是 MySQL 自带的逻辑备份工具。可以保证数据的一致性和服务的可用性。
保证数据的一致,在备份的时候进行锁表会自动锁表,锁住之后再备份。
本身为客户端工具: 远程备份: mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份.sql 本地备份: mysqldump -u用户名 -p密码 数据库名 >备份文件.sql
项目 | Value |
---|---|
-A(–all-databases) | 备份所有库 |
-B(–databases) | 备份多个数据库 |
-F(–flush-logs) | 备份之前刷新binlog日志 |
–default-character-set | 指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。 |
–no-data,-d | 不导出任何数据,只导出数据库表结构。 |
–lock-tables | 备份前,锁定所有数据库表 |
–single-transaction | 保证数据的一致性和服务的可用性 |
-f(–force) | 即使在一个表导出期间得到一个SQL错误,继续。 |
注意:
使用 mysqldump 备份数据库时避免锁表:
对一个正在运行的数据库进行备份请慎重!! 如果一定要在服务运行期间备份,可以选择添加 --single-transaction选项,
类似执行: mysqldump --single-transaction -u root -p123456 dbname > mysql.sql
备份单个表 [root@mysql-server ~]# mkdir /home/back #创建备份目录 [root@mysql-server ~]# mysqldump -uroot -p'qf123' company employee5 > /home/back/company.employee5.bak 备份多个表: 语法: mysqldump -u root -p1 db1 t1 t2 > /db1.t1_t2.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' company new_t1 new_t2 > /home/back/company.new_t1_t2.bak
备份一个库:相当于将这个库里面的所有表全部备份。 语法: # mysqldump -u root -p1 db1 > /db1.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' company > /home/back/company.bak 备份多个库: 语法:mysqldump -u root -p1 -B db1 db2 db3 > /db123.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' -B company testdb > /home/back/company_testdb.bak 备份所有的库: 语法:# mysqldump -u root -p1 -A > /alldb.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' -A > /home/back/allbase.bak
到目录下面查看一下:
为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志 。因为binlog使用binlog日志恢复数据时也会产生binlog日志。
为实验效果先将刚才备份的数据库和表删除了。登陆数据库: [root@mysql-server ~]# mysql -uroot -pqf123 mysql> show databases;
mysql> drop database company; mysql> \q
登陆mysql创建一个库 mysql> create database company; 恢复: [root@mysql-server ~]# mysql -uroot -p'qf123' company < /home/back/company.bak
登陆到刚才恢复的库中将其中的一个表删除掉 mysql> show databases; mysql> use company mysql> show tables; +-------------------+ | Tables_in_company | +-------------------+ | employee5 | | new_t1 | | new_t2 | +-------------------+ mysql> drop table employee5; 开始恢复: mysql> set sql_log_bin=0; #停止binlog日志 Query OK, 0 rows affected (0.00 sec) mysql> source /home/back/company.employee5.bak; -------加路径和备份的文件 恢复方式二: # mysql -u root -p1 db1 < db1.t1.bak 库名 备份的文件路径
1.备份表结构: 语法:mysqldump -uroot -p123456 -d database table > dump.sql [root@mysql-server ~]# mysqldump -uroot -p'qf123' -d company employee5 > /home/back/emp.bak 恢复表结构: 登陆数据库创建一个库 mysql> create database t1; 语法:# mysql -u root -p1 -D db1 < db1.t1.bak [root@mysql-server ~]# mysql -uroot -p'qf123' -D t1 < /home/back/emp.bak
登陆数据查看:
表的导出和导入只备份表内记录,不会备份表结构,需要通过mysqldump备份表结构,恢复时先恢复表结构,再导入数据。
mysql> show variables like "secure_file_priv"; 查询导入导出的目录。
修改安全文件目录: 1.创建一个目录:mkdir 路径目录 [root@mysql-server ~]# mkdir /sql 2.修改权限 [root@mysql-server ~]# chown mysql.mysql /sql 3.编辑配置文件: vim /etc/my.cnf 在[mysqld]里追加 secure_file_priv=/sql 4.重新启动mysql.
1.导出数据 登陆数据查看数据 mysql> show databases; #找到test库 mysql> use test #进入test库 mysql> show tables; #找到它t3表 mysql> select * from t3 into outfile '/sql/test.t3.bak'; 2.数据的导入 先将原来表里面的数据清除掉,只保留表结构 mysql> delete from t3; mysql> load data infile '/sql/test.t3.bak' into table t3; 如果将数据导入别的表,需要创建这个表并创建相应的表结构。
备份单个表 语法: # mysqldump -u root -p‘密码’ db1 t1 > /db1.t1.bak 库 表 备份文件存放位置 备份多个表 语法: # mysqldump -u root -p‘密码’ db1 t1 t2 > /db1.t1.bak 库 表1 表2 备份文件存放位置 备份表结构 语法:# mysqldump -uroot -p'密码' -d 库 表 > /备份文件路径 备份库 语法: # mysqldump -u root -p‘密码’ db1 > /db1.t1.bak 库 备份文件存放位置 备份库 语法: # mysqldump -u root -p‘密码’ -B db1 db2 > /db1.t1.bak 库1 库2 备份文件存放位置 备份所有库 语法:# mysqldump -u root -p‘密码’ -A > /alldb.bak 所有 备份文件存放位置 恢复前要先关闭bin-log日志 mysql> set sql_log_bin=0; #停止binlog日志 恢复表 语法:# mysql -uroot -p'qf123' company < /home/back/company.bak 在MySQL中也可以操作 >mysql source /home/back/company.employee5.bak; 加路径和备份的文件 恢复库 语法:# mysql -uroot -p'qf123' company < /home/back/company.bak 恢复表结构 语法:# mysqldump -uroot -p'密码' -D 表 < /备份文件路径 导出数据 mysql> select * from 表名 into outfile '文件路径'; 导出数据 mysql> load data infile '文件路径' into table 表名;