windows下Mysql 怎样备份和还原?
服务器系统是Windows server 2003的
数据库是mysql
请问现在怎样把mysql 数据库备份出来,待应用软件重新安装好后,再把数据库还原回去? 展开
备份:mysqldump -u root -p123456 kcgl> c:\20090219.sql
mysqldump 备份命令
root 用户名(root管理员)
123456 密码
kcgl 备份的数据库名;
> 备份符号
20090219.sql 备份的文件名
还原:
mysql -u root -p123456 kcgl< c:\20090219.sql
mysql 还原命令
root 用户名(root管理员)
123456 密码
dbcurr 备份的数据库名;
< 还原符号
20090219.sql还原的文件名
注意:首先要确保你的mysql 中有kcgl这个库,还原命令是不会自动建库的。
mysqldump 远程备份
mysqldump -h ip -uroot -proot database > c:\data.sql
---------其他---------
mysqldump备份:
mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径
案例:
mysqldump -uroot -p1234 -hlocalhost db1 a -w "id in (select id from b)" --lock-all-tables > c:\aa.txt
mysqldump还原:
mysqldump -u用户名 -p密码 -h主机 数据库 < 路径
案例:
mysql -uroot -p1234 db1 < c:\aa.txt
mysqldump按条件导出:
mysqldump -u用户名 -p密码 -h主机 数据库 a --where "条件语句" --no-建表> 路径
mysqldump -uroot -p1234 dbname a --where "tag='88'" --no-create-info> c:\a.sql
mysqldump按导入:
mysqldump -u用户名 -p密码 -h主机 数据库 < 路径
案例:
mysql -uroot -p1234 db1 < c:\a.txt
mysqldump导出表:
mysqldump -u用户名 -p密码 -h主机 数据库 表
案例:
mysqldump -uroot -p sqlhk9 a --no-data
-------------------------------------------------
mysqldump命令介绍
--all-databases, -A: 备份所有数据库
--databases, -B: 用于备份多个数据库,如果没有该选项,mysql dump 把第一个名字参数作为数据库名,后面的作为表名。使用该选项,mysql dum把每个名字都当作为数据库名。
--force, -f:即使发现sql错误,仍然继续备份
--host=host_name, -h host_name:备份主机名,默认为localhost
--no-data, -d:只导出表结构
--password[=password], -p[password]:密码
--port=port_num, -P port_num:制定TCP/IP连接时的端口号
--quick, -q:快速导出
--tables:覆盖 --databases or -B选项,后面所跟参数被视作表名
--user=user_name, -u user_name:用户名
--xml, -X:导出为xml文件
1.备份全部数据库的数据和结构
mysql dump -uroot -p123456 -A >F:\all.sql
2.备份全部数据库的结构(加 -d 参数)
mysql dump -uroot -p123456 -A -d>F:\all_struct.sql
3.备份全部数据库的数据(加 -t 参数)
mysql dump -uroot -p123456 -A -t>F:\all_data.sql
4.备份单个数据库的数据和结构(,数据库名mydb)
mysql dump -uroot -p123456 mydb>F:\mydb.sql
5.备份单个数据库的结构
mysql dump -uroot -p123456 mydb -d>F:\mydb.sql
6.备份单个数据库的数据
mysql dump -uroot -p123456 mydb -t>F:\mydb.sql
7.备份多个表的数据和结构(数据,结构的单独备份方法与上同)
mysql dump -uroot -p123456 mydb t1 t2 >f:\multables.sql
8.一次备份多个数据库
mysql dump -uroot -p123456 --databases db1 db2 >f:\muldbs.sql
还原部分分(1)mysql 命令行source方法 和 (2)系统命令行方法
1.还原全部数据库:
(1) mysql 命令行:mysql >source f:\all.sql
(2) 系统命令行: mysql -uroot -p123456 <f:\all.sql
2.还原单个数据库(需指定数据库)
(1) mysql >use mydb
mysql >source f:\mydb.sql
(2) mysql -uroot -p123456 mydb <f:\mydb.sql
3.还原单个数据库的多个表(需指定数据库)
(1) mysql >use mydb
mysql >source f:\multables.sql
(2) mysql -uroot -p123456 mydb <f:\multables.sql
4.还原多个数据库,(一个备份文件里有多个数据库的备份,此时不需要指定数据库)
(1) mysql 命令行:mysql >source f:\muldbs.sql
(2) 系统命令行: mysql -uroot -p123456 <f:\muldbs.sql
2020-06-17 · MySQL开源数据库领先者
前言
MySQL 5.6引入了GTID,每个事务都会产生一个GTID,我们可以通过验证主从GTID来验证主从数据的一致性。
为了叙述简便,定义一个量ALL_GTID: 表示某个数据库实例上 所有存在过的 或 将要存在的事务 的GTID(包括已经被purge掉的事务)。
在讨论数据库可用性的场景中, 当发生主备切换时, 需要进行数据补偿。通过比较主备的ALL_GTID,可以确定需要补偿多少数据:
在实例存活的情况,可以在实例状态中查询ALL_GTID。
在实例崩溃的情况,无法在实例状态中查询ALL_GTID。可以通过查询BINLOG中的Previous-GTIDs计算来获得ALL_GTID。
gtid_executed 代表着server上所有事务执行产生的GTID(包含已经被purge的BINLOG中的GTID或者是手动set gtid_purged的GTID)。
gtid_purged 代表着已经被purge到的GTID。gtid_purged是gtid_executed的子集。
gtid_retrieved 是从机上relay_log中的GTID。
拉取备份,进行还原
change master to
set @@global.gtid_purged='xxx';
将 从实例 的ALL_GTID手工置为xxx, 在通过GTID方式建立复制时不会出错.
将更新Binlog中记录的Previous-GTIDs (由于Binlog不可改变, 将产生新的Binlog, 记录新的Previous-GTIDs).
拉取备份,进行还原
change master to
set @@global.gtid_purged='xxx';
手工还原备份
验证change master和set gtid_purged在不同的MySQL版本中执行的差异
下面列举与ALL_GTID相关的变量。
与ALL_GTID相关的变量
Previous-GTIDs
Previous-GTIDs格式如下(环境为MySQL5.7,日志手动flush binary logs获得):
查看新轮转出的BINLOG:
下面为mysql-bin.00001中包含的GTID:
然后再次flush binary logs:
mysql-bin.00002中是没有任何GTID的。
综上Previous-GTIDs是本身这个BINLOG文件前面的所有BINLOG的集合。
全局变量中的GTID相关的变量
变量解释:
ALL_GTID 的计算
了解了GTID相关的变量之后,可以得到获得实例的All_GTID的集合的方法:
对象
方法
存活的Master实例 gtid_executed
存活的Slave实例 gtid_executed和gtid_retrieved的并集
非存活Master实例 最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID
非存活Slave实例 最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID
在获得非存活实例中的ALL_GTID时,最后一个BINLOG文件中的GTID可能不连续(比如事务同时来自于本实例客户端和复制回放),所以需要扫描最后一个BINLOG文件。
生产中我们使用Xtrabackup来产生一个 从实例 的流程如下:
set @@global.gtid_purged='xxx'; 的影响:
MySQL 5.7中set gtid_purged的行为变更
问题描述
回顾一下备份恢复的流程:
现象: 发现有一台MySQL 5.7的Slave服务器恢复后没有产生 正确的Previous-GTIDs。
分析
分析整个过程,解决问题应该分阶段进行手动模拟发现问题。以下为详细步骤:
环境
BINLOG数量,Previous-GTIDs状态
Xtrabackup 2.4.2 & MySQL 5.6 1,空
Xtrabackup 2.4.2 & MySQL 5.7 1,空
Xtrabackup 2.2.9 & MySQL 5.6 1,空
Xtrabackup 2.2.9 & MySQL 5.7 1,空
可见: 恢复过程不会轮转BINLOG。
环境
BINLOG数量,Previous-GTIDs状态
change master & MySQL 5.6 1,空
change master & MySQL 5.7 1,空
set gtid_purged & MySQL 5.6 2,正常
set gtid_purged & MySQL 5.7 1,空
可见: 执行set gtid_purged时不同版本的MySQL产生了差异
验证
对不同版本MySQL单独执行set @@global.gtid_purged='';语句。检查结果
环境
进行的操作
BINLOG数量,Previous-GTIDs状态
MySQL 5.7 reset master; set @@global.gtid_purged=”; 1,空
MySQL 5.6 reset master; set @@global.gtid_purged=”; 2,正常
结论
参考: http://bugs.mysql.com/bug.php?id=75767
官方解释: 在5.7版本中,执行SET GTID_PURGED语句后binlog_simple_gtid_recovery会给GTID_PURGED计算出一个错误的值。
由于5.7中新增了存储GTID的表。所以5.7版本中set @@global.gtid_purged='';语句被改成只修改存放GTID的表。
而5.6版本中会进行BINLOG轮转和向Previous_gtids_log_event中添加GTID。如果5.7需要产生和5.6相同结果的话,可以在SET GTID_PURGED语句后手动执行flush binary logs语句。