-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
161 lines (161 loc) · 14.4 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://conanwang.github.io</id>
<title>全不栈工程师</title>
<updated>2021-12-25T02:25:23.112Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://conanwang.github.io"/>
<link rel="self" href="https://conanwang.github.io/atom.xml"/>
<subtitle>记录conan日常学习点滴</subtitle>
<logo>https://conanwang.github.io/images/avatar.png</logo>
<icon>https://conanwang.github.io/favicon.ico</icon>
<rights>All rights reserved 2021, 全不栈工程师</rights>
<entry>
<title type="html"><![CDATA[mydumper源码学习系列2-修改myloader导入过程默认关闭binlog写入的行为]]></title>
<id>https://conanwang.github.io/post/mydumper-yuan-ma-xue-xi-xi-lie-2-xiu-gai-myloader-dao-ru-guo-cheng-mo-ren-guan-bi-binlog-xie-ru-de-xing-wei/</id>
<link href="https://conanwang.github.io/post/mydumper-yuan-ma-xue-xi-xi-lie-2-xiu-gai-myloader-dao-ru-guo-cheng-mo-ren-guan-bi-binlog-xie-ru-de-xing-wei/">
</link>
<updated>2021-12-24T10:23:45.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p> 小伙伴在使用myloader导入数据的过程中,不知是否遇到过这样的情况,在主db导入数据后,主db上数据查看导入正常,但是备机上啥数据都没有,很多初次使用myloader的同学可能都遇到过这样的问题,那么原因是啥呢?</p>
<h2 id="myloader导入数据中默认采取的一些行为">myloader导入数据中默认采取的一些行为</h2>
<p> 由于主从关系的mysql备机数据来自于主db的binlog增量更新,那么由此联想到是不是myloader在导入数据过程中,关闭了主db的binlog写入呢,让我们从这个角度来看看myloder的参数中是否有此类相关的选项,果然,注意看红框处<br>
<img src="https://conanwang.github.io/post-images/1640398093810.jpg" alt="" loading="lazy"><br>
这个--enble-binlog注释说的很清楚了,允许在恢复数据时,打开binlog写入功能,那么如果不带这个参数,默认情况下,是不是就关闭了binlog写入功能呢,从下面代码看,是的,不带这个选项的话,默认值是0.<br>
<img src="https://conanwang.github.io/post-images/1640397950550.jpg" alt="" loading="lazy"><br>
注意看enable_binlog不同值的行为,在0值的时候,我们看到,myloader会执行这样的sql</p>
<pre><code class="language-sql">set SQL_LOG_BIN=0
</code></pre>
<figure data-type="image" tabindex="1"><img src="https://conanwang.github.io/post-images/1640398396734.jpg" alt="" loading="lazy"></figure>
<h2 id="myloader为啥这么设计">myloader为啥这么设计</h2>
<p> 其实我个人不理解myloader为啥这么设计,使用mysql几乎都是以主从形式,这也是mysql当初能迅速流行的原因之一,而默认行为就是关闭binlog写入,那么每次恢复数据的时候,备机的数据肯定会不一致,新人很容易遗漏这个参数,而老手每次带上这个参数其实感觉也是多此一举。</p>
<h2 id="改变默认行为">改变默认行为</h2>
<p> 那么我们其实可以改变这个默认行为,默认是打开binlog写入,如果有需要,带上参数,关闭binlog写入,这样似乎在更符合我们的思考习惯。</p>
<p> 改动其实也不大,首先修改enable_binlog名称为disable_binlog,默认值修位0,也就是默认是打开binlog写入<br>
<img src="https://conanwang.github.io/post-images/1640398532358.jpg" alt="" loading="lazy"><br>
当disable_binlog为真时,也就是带上参数,值为1时候,执行关闭binlog语句<br>
<img src="https://conanwang.github.io/post-images/1640398597359.jpg" alt="" loading="lazy"><br>
最终效果如下,这样,就不用担心忘记带上这个参数导致备机数据不一致了<br>
<img src="https://conanwang.github.io/post-images/1640398694890.jpg" alt="" loading="lazy"></p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[myloader选项说明]]></title>
<id>https://conanwang.github.io/post/myloader-xuan-xiang-shuo-ming/</id>
<link href="https://conanwang.github.io/post/myloader-xuan-xiang-shuo-ming/">
</link>
<updated>2021-12-21T10:59:13.000Z</updated>
<content type="html"><![CDATA[<p>Application Options:</p>
<p>-d, --directory 待导入的数据</p>
<p>-q, --queries-per-transaction Number of queries per transaction, default 1000</p>
<p>-o, --overwrite-tables Drop tables if they already exist</p>
<p>-B, --database An alternative database to restore into</p>
<p>-s, --source-db Database to restore</p>
<p>-e, --enable-binlog Enable binary logging of the restore data</p>
<p>--innodb-optimize-keys Creates the table without the indexes and it adds them at the end</p>
<p>--set-names Sets the names, use it at your own risk, default binary</p>
<p>-L, --logfile Log file name to use, by default stdout is used</p>
<p>--purge-mode This specify the truncate mode which can be: NONE, DROP, TRUNCATE and DELETE</p>
<p>--disable-redo-log Disables the REDO_LOG and enables it after, doesn't check initial status</p>
<p>-r, --rows Split the INSERT statement into this many rows.</p>
<p>--max-threads-per-table Maximum number of threads per table to use, default 4</p>
<p>-h, --host The host to connect to</p>
<p>-u, --user Username with the necessary privileges</p>
<p>-p, --password User password</p>
<p>-a, --ask-password Prompt For User password</p>
<p>-P, --port TCP/IP port to connect to</p>
<p>-S, --socket UNIX domain socket file to use for connection</p>
<p>-t, --threads Number of threads to use, default 4</p>
<p>-C, --compress-protocol Use compression on the MySQL connection</p>
<p>-V, --version Show the program version and exit</p>
<p>-v, --verbose Verbosity of output, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2</p>
<p>--defaults-file Use a specific defaults file</p>
<p>--ssl Connect using SSL</p>
<p>--ssl-mode Desired security state of the connection to the server: DISABLED, PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY</p>
<p>--key The path name to the key file</p>
<p>--cert The path name to the certificate file</p>
<p>--ca The path name to the certificate authority file</p>
<p>--capath The path name to a directory that contains trusted SSL CA certificates in PEM format</p>
<p>--cipher A list of permissible ciphers to use for SSL encryption</p>
<p>--tls-version Which protocols the server permits for encrypted connections</p>
<p>--stream It will stream over STDOUT once the files has been written</p>
<p>--no-delete It will not delete the files after stream has been completed</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[mydumper源码学习系列1-获取全局锁失败可能引起不一致的同步位点]]></title>
<id>https://conanwang.github.io/post/ce-shi-wen-zhang/</id>
<link href="https://conanwang.github.io/post/ce-shi-wen-zhang/">
</link>
<updated>2021-12-21T08:21:25.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p> 最近在做一些mydumper的需求,写下这个系列文章全当学习记录。</p>
<h2 id="背景">背景</h2>
<p> 近期在工作中,发现mydumper出来的一份全量数据,用来做备机数据,建立主从关系后,备机总是发生“1032”找不到数据行的错误,不由让我怀疑难道备份出来的数据和源db是不一致的吗?</p>
<h2 id="mydumper当前备份逻辑说明">mydumper当前备份逻辑说明</h2>
<p> mydumper当前备份逻辑流程如下:<br>
<img src="https://conanwang.github.io/post-images/1640080061444.png" alt="" loading="lazy"><br>
<strong>主要步骤概括</strong></p>
<ul>
<li>主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,以阻止DML语句写入,保证数据的一致性</li>
<li>读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用</li>
<li>N个(线程数可以指定,默认是4)dump线程 START TRANSACTION WITH CONSISTENT SNAPSHOT; 开启读一致的事物</li>
<li>dump non-InnoDB tables, 首先导出非事物引擎的表</li>
<li>主线程 UNLOCK TABLES 非事物引擎备份完后,释放全局只读锁</li>
<li>dump InnoDB tables, 基于事物导出InnoDB表</li>
<li>事务结束</li>
</ul>
<h2 id="flush-tables-with-read-lock如果执行失败会怎么样">flush tables with read lock如果执行失败会怎么样?</h2>
<p> 通过上述的备份步骤,我们可以知道,"FLUSH TABLES WITH READ LOCK" 获取全局只读锁是为了防止其他会话修改数据,这样才能获取一致性的同步位点。那么问题来了,如果获取全局锁失败失败会怎么样?<br>
想象一下,当获取全局锁失败的情况下,这个时候其他会话对数据库继续进行读写,此时,如果mydumper继续通过"show master status" 获取备份同步点,这个同步点肯定是不一致的,用这个备份来做备机建立主从关系,在日后的同步过程中必然会由于1032,1062之类的错误导致同步中断.</p>
<h2 id="如果全局锁获取失败mydumper会怎么处理呢">如果全局锁获取失败,mydumper会怎么处理呢</h2>
<p> 那么焦点问题就来了,如果全局锁获取失败,也就是由于某种原因“FLUSH TABLES WITH READ LOCK” 执行失败,mydumper后续会怎么做呢?让我们从代码中一探究竟。<br>
打开mydumper.c文件,备份的逻辑几乎全部在这个文件里, 重点关注start_dump这个函数<br>
<img src="https://conanwang.github.io/post-images/1640081578895.jpg" alt="" loading="lazy"><br>
这里我们重点看上图中的1,2,3,4这个4个标记的地方:</p>
<ul>
<li>标记1,判断执行FLUSH TABLES WITH READ LOCK是否成功</li>
<li>标记2,如果执行失败,则打印日志Couldn't acquire global lock, snapshots will not be 字样的日志在stderr标准错误上。</li>
<li>标记3,errors变量值自增加1。</li>
<li>标记4,我们先不要看标记4,这一行是我加的,官方的实现只有标记1,2,3。<br>
从代码里我们明确了,即使获取不到全局锁,mydumper依然继续后续的备份动作,那errors这个变量自增1到底有啥用?<br>
让我们回到main主函数,可以看到在函数的结尾处,最后的程序执行状态码是根据errors来设置的,也就是说获取全局锁失败的唯一体现就是在程序执行完毕后查看$?的值才能体现出来,如果没有检查这个状态码,或者采用外部调用mydumper的方式来执行,没有关注这个状态码,那么,得到的数据备份集就可能是不一致的。<br>
<img src="https://conanwang.github.io/post-images/1640082310897.jpg" alt="" loading="lazy"></li>
</ul>
<h2 id="如何改进">如何改进</h2>
<p> 在我看来,避免这一情况,就是要显示的让备份失败,也就是不能生成看似正常的备份集,那么mydumper导出来的数据到底怎么样才是正常的备份集,myloader是怎么判断的呢?其实很简单,就是看备份目录里是否有metadata文件产生,如果备份不是正常结束,则产生的是类似,metadata.patiral这样的文件。于是,当获取不到全局锁,直接让程序退出,我觉得是最直接的办法,于是,有了之前标记4的代码。</p>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Hello Gridea]]></title>
<id>https://conanwang.github.io/post/hello-gridea/</id>
<link href="https://conanwang.github.io/post/hello-gridea/">
</link>
<updated>2018-12-11T16:00:00.000Z</updated>
<summary type="html"><![CDATA[<p>👏 欢迎使用 <strong>Gridea</strong> !<br>
✍️ <strong>Gridea</strong> 一个静态博客写作客户端。你可以用它来记录你的生活、心情、知识、笔记、创意... ...</p>
]]></summary>
<content type="html"><![CDATA[<p>👏 欢迎使用 <strong>Gridea</strong> !<br>
✍️ <strong>Gridea</strong> 一个静态博客写作客户端。你可以用它来记录你的生活、心情、知识、笔记、创意... ...</p>
<!-- more -->
<p><a href="https://github.com/getgridea/gridea">Github</a><br>
<a href="https://gridea.dev/">Gridea 主页</a><br>
<a href="http://fehey.com/">示例网站</a></p>
<h2 id="特性">特性👇</h2>
<p>📝 你可以使用最酷的 <strong>Markdown</strong> 语法,进行快速创作</p>
<p>🌉 你可以给文章配上精美的封面图和在文章任意位置插入图片</p>
<p>🏷️ 你可以对文章进行标签分组</p>
<p>📋 你可以自定义菜单,甚至可以创建外部链接菜单</p>
<p>💻 你可以在 <strong>Windows</strong>,<strong>MacOS</strong> 或 <strong>Linux</strong> 设备上使用此客户端</p>
<p>🌎 你可以使用 <strong>𝖦𝗂𝗍𝗁𝗎𝖻 𝖯𝖺𝗀𝖾𝗌</strong> 或 <strong>Coding Pages</strong> 向世界展示,未来将支持更多平台</p>
<p>💬 你可以进行简单的配置,接入 <a href="https://github.com/gitalk/gitalk">Gitalk</a> 或 <a href="https://github.com/SukkaW/DisqusJS">DisqusJS</a> 评论系统</p>
<p>🇬🇧 你可以使用<strong>中文简体</strong>或<strong>英语</strong></p>
<p>🌁 你可以任意使用应用内默认主题或任意第三方主题,强大的主题自定义能力</p>
<p>🖥 你可以自定义源文件夹,利用 OneDrive、百度网盘、iCloud、Dropbox 等进行多设备同步</p>
<p>🌱 当然 <strong>Gridea</strong> 还很年轻,有很多不足,但请相信,它会不停向前 🏃</p>
<p>未来,它一定会成为你离不开的伙伴</p>
<p>尽情发挥你的才华吧!</p>
<p>😘 Enjoy~</p>
]]></content>
</entry>
</feed>