mysql命令行下怎样实现数据的回滚 *** 作

mysql命令行下怎样实现数据的回滚 *** 作,第1张

当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分。因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性。所以带Binlog的CrashSafe要求MySQL宕机重启后能够保证:

- 所有已经提交的事务的数据仍然存在。

- 所有没有提交的事务的数据自动回滚。

- 所有已经提交了的事务的Binlog Event也仍然存在。

- 所有没有提交事务没有记录Binlog Event。

这些要求很好理解,如果重启后数据还在,但是Binlog Event没有了,就没办法复制到其他节点上了。如果重启后,数据没了,但是Binlog Event还在,那么不存在的数据就会被复制到其他节点上,从而导致主从的不一致。

为了保证带Binlog的CrashSafe,MySQL内部使用的两阶段提交(Two Phase Commit)。

2 - MySQL的Two Phase Commit(2PC)

在开启Binlog后,MySQL内部会自动将普通事务当做一个XA事务来处理:

- 自动为每个事务分配一个唯一的ID

- COMMIT会被自动的分成Prepare和Commit两个阶段。

- Binlog会被当做事务协调者(Transaction Coordinator),Binlog Event会被当做协调者日志。

想了解2PC,可以参考文档:【https://en.wikipedia.org/wiki/Two-phase_commit_protocol。】

- 分布式事务ID(XID)

使用2PC时,MySQL会自动的为每一个事务分配一个ID,叫XID。XID是唯一的,每个事务的XID都不相同。XID会分别被Binlog和InnoDB记入日志中,供恢复时使用。MySQ内部的XID由三部分组成:

- 前缀部分

前缀部分是字符串"MySQLXid"

- Server ID部分

当前MySQL的server_id

- query_id部分

为了保证XID的的唯一性,数字部分使用了query_id。MySQL内部会自动的为每一个语句分配一个query_id,全局唯一。

参考代码:sql/xa。h的struct xid_t结构。

- 事务的协调者Binlog

Binlog在2PC中充当了事务的协调者(Transaction Coordinator)。由Binlog来通知InnoDB引擎来执行prepare,commit或者rollback的步骤。事务提交的整个过程如下:

1. 协调者准备阶段(Prepare Phase)

告诉引擎做Prepare,InnoDB更改事务状态,并将Redo Log刷入磁盘。

2. 协调者提交阶段(Commit Phase)

2.1 记录协调者日志,即Binlog日志。

2.2 告诉引擎做commit。

注意:记录Binlog是在InnoDB引擎Prepare(即Redo Log写入磁盘)之后,这点至关重要。

在MySQ的代码中将协调者叫做tc_log。在MySQL启动时,tc_log将被初始化为mysql_bin_log对象。参考sql/binlog.cc中的init_server_components():

if (opt_bin_log) tc_log= &mysql_bin_log

而在事务提交时,会依次执行:

tc_log->prepare();

tc_log->commit();

参考代码:sql/binlog.cc中的ha_commit_trans()。当mysql_bin_log是tc_log时,prepare和commit的代码在sql/binlog.cc中:

MYSQL_BIN_LOG::prepare();

MYSQL_BIN_LOG::commit();

-协调者日志Xid_log_event

作为协调者,Binlog需要将事务的XID记入日志,供恢复时使用。Xid_log_event有以下几个特点:

- 仅记录query_id

因为前缀部分不变,server_id已经记录在Event Header中,Xid_log_event中只记录query_id部分。

- 标志事务的结束

在Binlog中相当于一个事务的COMMIT语句。

一个事务在Binlog中看起来时这样的:

Query_log_event("BEGIN")DML产生的events Xid_log_event

- DDL没有BEGIN,也没有Xid_log_event 。

- 仅InnoDB的DML会产生Xid_log_event

因为MyISAM不支持2PC所以不能用Xid_log_event ,但会有COMMIT Event。

Query_log_event("BEGIN")DML产生的eventsQuery_log_event("COMMIT")

问题:Query_log_event("COMMIT")和Xid_log_event 有不同的影响吗?

- Xid_log_event 中的Xid可以帮助master实现CrashSafe。

- Slave的CrashSafe不依赖Xid_log_event

事务在Slave上重做时,会重新产生XID。所以Slave服务器的CrashSafe并不依赖于Xid_log_event 。Xid_log_event 和Query_log_event("COMMIT"),只是作为事务的结尾,告诉Slave Applier去提交这个事务。因此二者在Slave上的影响是一样的。

3 - 恢复(Recovery)

这个机制是如何保证MySQL的CrashSafe的呢,我们来分析一下。这里我们假设用户设置了以下参数来保证可靠性:

- 恢复前事务的状态

在恢复开始前事务有以下几种状态:

- InnoDB中已经提交

根据前面2PC的过程,可知Binlog中也一定记录了该事务的的Events。所以这种事务是一致的不需要处理。

- InnoDB中是prepared状态,Binlog中有该事务的Events。

需要通知InnoDB提交这些事务。

- InnoDB中是prepared状态,Binlog中没有该事务的Events。

因为Binlog还没记录,需要通知InnoDB回滚这些事务。

- Before InnoDB Prepare

事务可能还没执行完,因此InnoDB中的状态还没有prepare。根据2PC的过程,Binlog中也没有该事务的events。 需要通知InnoDB回滚这些事务。

- 恢复过程

从上面的事务状态可以看出:恢复时事务要提交还是回滚,是由Binlog来决定的。

- 事务的Xid_log_event 存在,就要提交。

- 事务的Xid_log_event 不存在,就要回滚。

恢复的过程非常简单:

- 从Binlog中读出所有的Xid_log_event

- 告诉InnoDB提交这些XID的事务

- InnoDB回滚其它的事务

1.开始中找出运行:输入cmd

2.查找mysql所在盘,我的在D盘,所以接着输入:d:

3.在d盘中查找mysql所在目录:cd appserv\mysql\bin

4.再输入主机名、数据库名、密码:mysql -h localhost -u root -p

5.最后输入数据库密码

db2 cmd命令 *** 作

1、 打开命令行窗口

#db2cmd

2、 打开控制中心 www.2cto.com

# db2cmd db2cc

3、 打开命令编辑器

db2cmd db2ce

===== *** 作数据库命令=====

4、 启动数据库实例

#db2start

5、 停止数据库实例

#db2stop

如果你不能停止数据库由于激活的连接,在运行db2stop前执行db2 force application all就可以了 /db2stop force

6、 创建数据库

#db2 create db [dbname]

7、 连接到数据库 www.2cto.com

#db2 connect to [dbname] user [username] using [password]

8、 断开数据库连接

#db2 connect reset

9、 列出所有数据库

#db2 list db directory

10、 列出所有激活的数据库

#db2 list active databases

11、 列出所有数据库配置

#db2 get db cfg

12、 删除数据库

#db2 drop database [dbname]

(执行此 *** 作要小心)

如果不能删除,断开所有数据库连接或者重启db2

========= *** 作数据表命令==========

13、 列出所有用户表

#db2 list tables

14、列出所有系统表

#db2 list tables for system

15、列出所有表

#db2 list tables for all

16、 列出系统表

#db2 list tables for system

17、列出用户表

#db2 list tables for user

18、 列出特定用户表

#db2 list tables for schema [user]

19、 创建一个与数据库中某个表(t2)结构相同的新表(t1)

#db2 create table t1 like t2

20、 将一个表t1的数据导入到另一个表t2

#db2 "insert into t1 select * from t2"

21、 查询表

#db2 "select * from table name where ..."

22、 显示表结构

#db2 describe table tablename

23、 修改列

#db2 alter table [tablename] alter column [columname] set data type varchar(24)

======脚本文件 *** 作命令=======

24、 执行脚本文件

#db2 -tvf scripts.sql

25、帮助命令

* 查看命令帮助

#db2 ? db2start

* 查看错误码信息

#db2 ? 22001

* memo: 详细命令请使用"db2 ? <command>"进行查看。 

=========================

26、备份数据库

#db2 backup db <db name>

备注:执行以上命令之前需要断开数据库连接

27、在线备份数据库

#db2 -v "BACKUP DATABASE <database name>ONLINE TO <path>WITH 2 BUFFERS BUFFER 1024 INCLUDE LOGS WITHOUT PROMPTING"

28、恢复数据库

#db2 restore db <source db name>

29、在线恢复数据库

#db2 "RESTORE DB <database name>TO <db path>LOGTARGET <logpath>WITHOUT PROMPTING"

#db2 "ROLLFORWARD DB <database name>TO END OF LOGS AND STOP" ...

30、导出数据文件

#db2move <db name>export

[-sn <模式名称,一般为db2admin>]

[-tn <表名,多个之间用逗号分隔>]

31、导入数据文件

#db2move <db name>import

32、获取db2数据库管理配置环境信息

#db2 get dbm cfg

33、.获取db2某个数据库数据库管理配置环境信息

#db2 get db cfg for <db name>

或者:连接至某个数据库以后执行db2 get db cfg

34、更改db2日志空间的大小

备注:以下命令为了防止db2数据库过份使用硬盘空间而设,仅用于开发者自己机器上的db2,如果是服务器,则参数需要修改。

#db2 UPDATE DB CFG FOR <db name>USING logretain OFF logprimary 3 logsecond 2 logfilsiz 25600

如果页大小是4KB,则以上命令创建3个100M的日志文件,占用300MB硬盘空间。25600*4KB=102400KB。

35、创建临时表空间

#DB2 CREATE USER TEMPORARY TABLESPACE STMASPACE PAGESIZE 32 K MANAGED BY DATABASE USING (FILE 'D:\DB2_TAB\STMASPACE.F1' 10000)

EXTENTSIZE 256

36、获取数据库管理器的快照数据

#db2 –v get snapshot for dbm

37、显示进行程号

#db2 list applications show detail

===================================================

一、加载数据:

1、 以默认分隔符加载,默认为“,”号

db2 "import from btpoper.txt of del insert into btpoper"

2、 以指定分隔符“|”加载

db2 "import from btpoper.txt of del modified by coldel| insert into btpoper"

二、卸载数据:

1、 卸载一个表中全部数据

db2 "export to btpoper.txt of del select * from btpoper"

db2 "export to btpoper.txt of del modified by coldel| select * from btpoper"

2、 带条件卸载一个表中数据

db2 "export to btpoper.txt of del select * from btpoper where brhid='907020000'"

db2 "export to cmmcode.txt of del select * from cmmcode where codtp='01'"

db2 "export to cmmcode.txt of del modified by coldel| select * from cmmcode where codtp='01'"

三、查询数据结构及数据:

db2 "select * from btpoper"

db2 "select * from btpoper where brhid='907020000' and oprid='0001'"

db2 "select oprid,oprnm,brhid,passwd from btpoper"

四、删除表中数据:

db2 "delete from btpoper"

db2 "delete from btpoper where brhid='907020000' or brhid='907010000'"

五、修改表中数据:

db2 "update svmmst set prtlines=0 where brhid='907010000' and jobtp='02'"

db2 "update svmmst set prtlines=0 where jobtp='02' or jobtp='03'"

六、联接数据库

db2 connect to btpdbs

七、清除数据库联接

db2 connect reset 断开数据库连接

db2 terminate 断开数据库连接

db2 force applications all 断开所有数据库连接

八、备份数据库

1、 db2 backup db btpdbs

2、 db2move btpdbs export

db2look -d btpdbs -e -x [-a] -o crttbl.sql

九、恢复数据库

1、 db2 restore db btpdbs without rolling forward

2、 db2 -tvf crtdb.sql

crtdb.sql文件内容:create db btpdbs on /db2catalog

db2 -stvf crttbl.sql

db2move btpdbs import

十、DB2帮助命令:

db2 ?

db2 ? restroe

db2 ? sqlcode (例:db2 ? sql0803) 注:code必须为4位数,不够4位,前面补0


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10016339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存