阅读xtrabackup代码的一点笔记

xtrabackup
binary最重要的两个过程是backup和prepare,对应的函数分别是xtrabackup_backup_func()和xtrabackup_prepare_func(),这里做一些阅读代码时的笔记。

xtrabackup backup的线程模型:

1. 一个log拷贝线程;

2. n个ibd文件拷贝线程;

3. 一个io监控线程;

4. 通过suspend_start/suspend_end文件来标注是否启动终止线程;

typedef struct {

datafiles_iter_t *it;

uint num;

uint *count;

os_ib_mutex_t  count_mutex;

os_thread_id_t  id;

}data_thread_ctxt_t;

数据线程上下文

切换工作目录;

116 /** Set if InnoDB must operate in read-only mode. We don‘t do
any

117 recovery and open all tables in RO mode instead of RW mode. We
don‘t

118 sync the max trx id to disk either. */

xb_set_innodb_read_only()  将innodb设成只读模式

srv_backup_mode=TRUE;  将innodb设成backup模式;

设置innodb的一系列参数

innodb_init_param()

xb_normalize_init_values(void)

修改srv_unix_file_flush_method

根据bp大小,调整srv_max_n_threads参数

1017
/*********************************************************************//**

1018 Initializes the synchronization primitives, memory system, and the
thread

1019 local storage. */

srv_general_init()

ut_crc32_init()

xb_filters_init()

2567
/************************************************************************

2568 Initializes the I/O and tablespace cache subsystems. */

xb_fil_io_init(void)

838 /******************************************************//**

839 Initializes the log. */

log_init(void)

585
/*********************************************************************//**

586 Creates the lock system at database start. */

lock_sys_create()

open_or_create_log_file

创建xtrabackup_extra_lsndir/extrabackup_traget_dir

表空间memory cache

fil_system_t* f_system = fil_system;

recv_find_max_checkpoint(&max_cp_group, &max_cp_field)

log_group_read_checkpoint_info(max_cp_group, max_cp_field)

checkpoint_lsn_start/checkpoint_no_start

确认一致的checkpoint状态;

创建XB_LOG_FILENAME文件,写入文件头信息;

创建io_watching_thread;

从checkpoint位置开始copy log文件;

xtrabackup_copy_logfile(checkpoint_lsn_start, FALSE)

log_copying/log_copying_stop

创建日志copy线程

os_thread_create(log_copying_thread, NULL,
&log_copying_thread_id);

2591
/****************************************************************************

2592 Populates the tablespace memory cache by scanning for and opening data
files.

2593 @returns DB_SUCCESS or error code.*/

xb_load_tablespaces()

挂起,等待XB_FN_SUSPENDED_AT_START文件被删除

xtrabackup_suspend

xb_page_bitmap_init()

根据xtrabackup_parallel设置,创建data_copy_thread_func线程

等待所有data_copy_thread_func线程退出

挂起,等待XB_FN_SUSPENDED_AT_END文件被删除

xtrabackup_suspend

读取最新的checkpoint, 记录在metadata的to_lsn字段;

通过设置log_copying=FALSE && set
log_copying_stop,停止log_copying_thread;

创建一个文件XB_FN_LOG_COPIED,通知外部脚本,log_copying_thread已经结束;

写metadata;

prepare_func

 

1. 切换到xtrabackup_real_target_dir

2. 读取XTRABACKUP_METADATA_FILENAME,获取原信息;

metadata_type

3. xtrabackup_init_temp_log()

4. innodb_init_param()

2670
/************************************************************************

2671 Initialize the tablespace memory cache and populate it by scanning for
and

2672 opening data files.

2673 @returns DB_SUCCESS or error code.*/

xb_data_files_init()

应用增量到全量

xtrabackup_apply_deltas()

重设innodb初始化参数

innodb_init_param()

innodb_init()

遍历文件

mtr_start -> mtr_commit

trx_sys_print_mysql_binlog_offset()

将binlog位置信息输出到 xtrabackup_binlog_pos_innodb文件中

xtrabackup_close_temp_log(TRUE)

输出记录metadata_log

backup

$./xtrabackup_56 --defaults-file=/u01/my3928/my.cnf --backup
--target_dir=/u01/xianlin.lh/backup_dir/

./xtrabackup_56 version 2.1.8 for MySQL server 5.6.15 Linux (x86_64)
(revision id: undefined)

xtrabackup: uses posix_fadvise().

xtrabackup: cd to /u01/my3928/data

xtrabackup: using the following InnoDB configuration:

xtrabackup: innodb_data_home_dir = /u01/my3928/data

xtrabackup: innodb_data_file_path = ibdata1:4G;ibdata2:16M:autoextend

xtrabackup: innodb_log_group_home_dir = /u01/my3928/data

xtrabackup: innodb_log_files_in_group = 4

xtrabackup: innodb_log_file_size = 1073741824

2014-05-05 17:29:35 2ac06bc4a2c0 InnoDB: Using Linux native AIO

xtrabackup: using O_DIRECT

>> log scanned up to (1451746590)

[01] Copying /u01/my3928/data/ibdata1 to
/u01/xianlin.lh/backup_dir/ibdata1

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

[01] ...done

[01] Copying /u01/my3928/data/ibdata2 to
/u01/xianlin.lh/backup_dir/ibdata2

[01] ...done

[01] Copying ./test/t2.ibd to /u01/xianlin.lh/backup_dir/test/t2.ibd

[01] ...done

[01] Copying ./test/t4.ibd to /u01/xianlin.lh/backup_dir/test/t4.ibd

[01] ...done

[01] Copying ./test/t3.ibd to /u01/xianlin.lh/backup_dir/test/t3.ibd

[01] ...done

[01] Copying ./test/sbtest1.ibd to
/u01/xianlin.lh/backup_dir/test/sbtest1.ibd

>> log scanned up to (1451746590)

>> log scanned up to (1451746590)

[01] ...done

[01] Copying ./test/t1.ibd to /u01/xianlin.lh/backup_dir/test/t1.ibd

[01] ...done

[01] Copying ./mysql/innodb_index_stats.ibd to
/u01/xianlin.lh/backup_dir/mysql/innodb_index_stats.ibd

[01] ...done

[01] Copying ./mysql/slave_worker_info.ibd to
/u01/xianlin.lh/backup_dir/mysql/slave_worker_info.ibd

[01] ...done

[01] Copying ./mysql/innodb_table_stats.ibd to
/u01/xianlin.lh/backup_dir/mysql/innodb_table_stats.ibd

[01] ...done

[01] Copying ./mysql/slave_relay_log_info.ibd to
/u01/xianlin.lh/backup_dir/mysql/slave_relay_log_info.ibd

[01] ...done

[01] Copying ./mysql/slave_master_info.ibd to
/u01/xianlin.lh/backup_dir/mysql/slave_master_info.ibd

[01] ...done

>> log scanned up to (1451746590)

xtrabackup: The latest check point (for incremental): ‘1451746590‘

xtrabackup: Stopping log copying thread.

.>> log scanned up to (1451746590)

xtrabackup: Transaction log of lsn (1451746590) to (1451746590) was
copied.

创建备份的流程

http://www.percona.com/doc/percona-xtrabackup/2.1/xtrabackup_bin/creating_a_backup.html

1 backup_type = full-backuped

2 from_lsn = 0

3 to_lsn = 1451746590

4 last_lsn = 1451746590

5 compact = 0

prepare

$./xtrabackup_56 --defaults-file=/u01/my3928/my.cnf --prepare
--target-dir=/u01/xianlin.lh/backup_dir/

./xtrabackup_56 version 2.1.8 for MySQL server 5.6.15 Linux (x86_64)
(revision id: undefined)

xtrabackup: cd to /u01/xianlin.lh/backup_dir/

xtrabackup: This target seems to be not prepared yet.

xtrabackup: xtrabackup_logfile detected: size=2097152,
start_lsn=(1451746590)

xtrabackup: using the following InnoDB configuration for recovery:

xtrabackup: innodb_data_home_dir = ./

xtrabackup: innodb_data_file_path = ibdata1:4G;ibdata2:16M:autoextend

xtrabackup: innodb_log_group_home_dir = ./

xtrabackup: innodb_log_files_in_group = 1

xtrabackup: innodb_log_file_size = 2097152

2014-05-05 18:38:32 2b7f2f5202c0 InnoDB: Using Linux native AIO

xtrabackup: using the following InnoDB configuration for recovery:

xtrabackup: innodb_data_home_dir = ./

xtrabackup: innodb_data_file_path = ibdata1:4G;ibdata2:16M:autoextend

xtrabackup: innodb_log_group_home_dir = ./

xtrabackup: innodb_log_files_in_group = 1

xtrabackup: innodb_log_file_size = 2097152

2014-05-05 18:38:32 2b7f2f5202c0 InnoDB: Using Linux native AIO

xtrabackup: Starting InnoDB instance for recovery.

xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory
parameter)

InnoDB: The InnoDB memory heap is disabled

InnoDB: Mutexes and rw_locks use GCC atomic builtins

InnoDB: Compressed tables use zlib 1.2.3

InnoDB: Using Linux native AIO

InnoDB: Using CPU crc32 instructions

InnoDB: Initializing buffer pool, size = 100.0M

InnoDB: Completed initialization of buffer pool

InnoDB: Highest supported file format is Barracuda.

InnoDB: The log sequence numbers 552524932 and 552524932 in ibdata files do
not match the log sequence number 1451746590 in the ib_logfiles!

InnoDB: Database was not shutdown normally!

InnoDB: Starting crash recovery.

InnoDB: Reading tablespace information from the .ibd files...

InnoDB: Restoring possible half-written data pages

InnoDB: from the doublewrite buffer...

InnoDB: Last MySQL binlog file position 0 26767310, file name
mysql-bin.000023

InnoDB: 128 rollback segment(s) are active.

InnoDB: Waiting for purge to start

2014-05-05 18:38:33 2b7f49056700 InnoDB: Warning: table
‘test/sbtest1‘

InnoDB: in InnoDB data dictionary has unknown flags 50.

InnoDB: 5.6.15 started; log sequence number 1451746590

[notice (again)]

If you use binary log and don‘t use any hack of group commit,

the binary log position seems to be:

InnoDB: Last MySQL binlog file position 0 26767310, file name
mysql-bin.000023

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

InnoDB: FTS optimize thread exiting.

InnoDB: Starting shutdown...

InnoDB: Shutdown completed; log sequence number 1451747281

prepare的流程:

http://www.percona.com/doc/percona-xtrabackup/2.1/xtrabackup_bin/preparing_the_backup.html

1 backup_type = full-prepared

2 from_lsn = 0

3 to_lsn = 1451746590

4 last_lsn = 1451746590

5 compact = 0

阅读xtrabackup代码的一点笔记,布布扣,bubuko.com

时间: 2024-10-29 10:46:23

阅读xtrabackup代码的一点笔记的相关文章

《梦断代码》读书笔记 第2篇

<梦断代码>读书笔记 第2篇 第7章:细节视图 第8章:白板上的即时贴 第9章:方法 第10章:工程师和艺术家 第11章:通往狗食版之路 “读书时我喜欢上数学课——这类东西之所以能吸引我,是因为我知道自己做对了.”在书里面我找到了自己刚接触计算机时不喜欢编程可能的原因:我不知道自己是否做对了,也没有很顺利就做对的时候,慢慢地导致排斥编程,特别是一点思路也没有,或者知道这个程序将会花费我很多时间时情绪很糟糕,所以它不能吸引我.到现在,每次找到程序中不对的地方再修改正确,即使消耗很多时间,也会有一

最近看代码的一点总结

最近看了些libevent的源码, 发现自己的技术还差的很远. 之前写程序总习惯自己实现.有的东西自己掌握不牢,或者没有接触到新的技术,总是用笨方法写出不好看的代码.之前对TCP/IP,网络编程不是很熟悉,实现的TCP客户端断线重连就很弱. 实现的服务器端监听端口,同时处理多个连接的程序,没有理解清楚one connection one thread的思想,写的代码不够简洁高效. 还是在一次面试中遇到select/poll/epoll相关的问题,之后我才开始在网上以及书上注意到IO多路复用相关的

[转&amp;精]IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序. IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有

《梦断代码》读书笔记 第0篇

<梦断代码>读书笔记 第0篇 第0章:软件时间 第1章:死定了 第2章:Agenda之魂 从老师布置这个作业之后,我便按照自己的计划开始阅读识字以来的第一本关于软件工程的小说——<梦断代码>,周一至周五每天睡前读几页. 首先,第一遍从第0章至第1章看完,我愣是不知道书上到底在说些什么,感觉这小说跟教科书一样好催眠,说实话,每次还没看多少行就困得不行了.所以,我看了第二遍(而且还寻思着再看不懂也不看第三遍了),果然,我还是没有与作者产生共鸣.不过,在再次阅读的过程中我勾画了一些给自己

简单使用Git和Github来管理自己的代码和读书笔记

以前不知道使用代码管理工具,最后写的一些东西都没有了,由于硬盘坏了或者不小心格式化了之类的,后来使用了Git 和Github来托管自己的代码和读书笔记方便了不少,到哪里只要有网就可以把自己的东西拷贝下来继续使用. 我这里简单的记录一下我使用的过程,最简单的使用都是,高级的功能我一直没有使用到,虽然买一本<Git权威指南> 但是很多东西用不到就不能够真的会.下面开始简单介绍我使用的方法,我这个是在windows上使用的.我使用分两种情况, 因为我的代码都是在Linux下写的,所以在linux下主

代码大全学习笔记(什么是构建)

  构建有时也被认为是"coding"或者"programing".编码算不上是最贴切的词,因为它有一种"把已经存在的设计机械化的翻译成计算机语言"的意味,而构建并不是机械化的,需要可观的创造力和判断力,人们常常用编程代替构建.   构建的步骤: 1.验证前面的工作已经完成(如定义问题,需求分析). 2.确定如何去测试所写的代码. 3.设计并编写类或者子程序. 4.创建并命名变量和具名常量. 5.选择控制结构,组织语句块. 6.对你的代码进行单元

代码大全读书笔记 - 开篇

说起来,<代码大全>这本书书名实在恶俗.在我推荐给展鸿的时候,他说"雾草,这名字看着就像天朝地摊那种XX全书一类的山寨书-" 是的,其实买这个书的原因就是京东买100减30,我买了10块钱的东西,凑了一下单,书到手之前还以为是代码清单,或者以前ACM模板一样的书,甚至买来的一个月里面都拿来当枕头(足足10+cm厚). 这个周末偶然的翻开,才发现,世界上竟然有如此精彩的书,而且很多东西讲的虽然是软件项目,但给了我很多引申到其他东西上面的灵感.很多地方我读到之后,都会兴奋的心跳

C#小常识集锦(一)--《更锋利的CSharp代码》读书笔记

?.采用类似匈牙利命名法为控件命令,对于其他变量申明则不需要了 e.g. Button btnAdd; e.g. TextBox txtUsername; e.g. ListBox lstFileNames; e.g. Panel panelInfo; ?.对于函数参数.局部变量.私有及受保护字段的命名采用Camel规则(首字母小写),其他的情况如命名空间.结构.类.接口.枚举.枚举项.属性.方法.事件.委托及公开的字段等都采用Pascal规则(首字母大写) ?.多使用XML文档注释,它与VS开

使用vscode阅读C代码outline不显示问题

1 问题:使用vscode code 阅读C代码 outline 显示No symbols found in document 'xxxx' 2 参考网上解决方法,进行如下操作 2.1  安装C/C++ 扩展 2.2  安装 clang  和  安装MinGw, 理论上来说只要一个就好了 2.3 配置工程头文件路径,Ctrl+Shift+p, 选择C/C++:Edit Configurateions(JSON),弹出c_pp_properties.json文件进行配置 3 进行上述步骤后,发现依