??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一级持黄大片99久久,狠狠色噜噜色狠狠狠综合久久 ,久久电影网一区http://www.shnenglu.com/qinqing1984/category/21398.htmlxQ操作系l、网l、数据库和安?/description>zh-cnMon, 11 May 2020 21:23:27 GMTMon, 11 May 2020 21:23:27 GMT60Oracle数据cdNumber的解析实?/title><link>http://www.shnenglu.com/qinqing1984/archive/2020/05/08/217292.html</link><dc:creator>春秋十二?/dc:creator><author>春秋十二?/author><pubDate>Fri, 08 May 2020 04:23:00 GMT</pubDate><guid>http://www.shnenglu.com/qinqing1984/archive/2020/05/08/217292.html</guid><wfw:comment>http://www.shnenglu.com/qinqing1984/comments/217292.html</wfw:comment><comments>http://www.shnenglu.com/qinqing1984/archive/2020/05/08/217292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qinqing1984/comments/commentRss/217292.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qinqing1984/services/trackbacks/217292.html</trackback:ping><description><![CDATA[<strong style="font-size: 13pt;">存储格式</strong><br />    Oracle Number数据cd是变长的Q占0~22字节Q不像编E语a中的2/4字节整数?/8字节点敎ͼ关于它的存储格式与解析,DSI上有详细的描qͼ如下所C?br />              <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_datatype_number.png" width="678" height="509" alt="" /><br />    <br />    <strong style="font-size: 12pt;">W号?指数字节</strong>描述如下<br />             <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_datatype_number_signbit_exponent_byte.png" width="678" height="509" alt="" /><br />    <br />    <strong style="font-size: 12pt;">数字字节</strong>描述如下<br />             <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_datatype_number_digits_byte.png" width="678" height="508" alt="" /><br />    <br />    <strong style="font-size: 12pt;">正数或零值的计算</strong><br />             <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_datatype_number_positive.png" width="678" height="510" alt="" /><br />    <br />    <strong style="font-size: 12pt;">负数值的计算</strong><br />             <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_datatype_number_negative.png" width="678" height="509" alt="" /><br /> <br /> <strong style="font-size: 13pt;">解析实现</strong><br />    ׃Oracle Number的精度高?8位,q超Z基本定长整数或QҎ(gu)表达的数D_(d)因此解析实际上是大整?实数的四则运,为避免造轮子,本文使用?span style="color: red;"><strong>GMP</strong></span>开源库Q?a target="_blank">https://gmplib.org/</a>Q,用于L_ֺ的算术运,操作有符h数、有理数和QҎ(gu)Q除了在GMP机器上运行的可用内存所暗示的精度之外,对精度没有实际的限制。解析实现的核心函数?strong style="font-size: 12pt;">orcl_raw2number</strong><br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080; "> 1</span> #include <stdio.h><br /> <span style="color: #008080; "> 2</span> #include <assert.h><br /> <span style="color: #008080; "> 3</span> #include <gmp.h><br /> <span style="color: #008080; "> 4</span> <br /> <span style="color: #008080; "> 5</span> <span style="color: #0000FF; ">#define</span> MAX_PREC  256<br /> <span style="color: #008080; "> 6</span> <br /> <span style="color: #008080; "> 7</span> <span style="color: #0000FF; ">static</span> mpf_t s_base100;<br /> <span style="color: #008080; "> 8</span> <span style="color: #0000FF; ">static</span> mpf_t s_one;<br /> <span style="color: #008080; "> 9</span> <br /> <span style="color: #008080; ">10</span> <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">void</span> <span style="color: #800000; font-size: 12pt;"><strong>init_mpf_globals</strong></span>()<br /> <span style="color: #008080; ">11</span> {<br /> <span style="color: #008080; ">12</span>     mpf_init_set_ui(s_base100, 100);<br /> <span style="color: #008080; ">13</span>     mpf_init_set_ui(s_one, 1);<br /> <span style="color: #008080; ">14</span> }<br /> <span style="color: #008080; ">15</span> <br /> <span style="color: #008080; ">16</span> <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">void</span> <strong style="color: #800000; font-size: 12pt;">clear_mpf_globals</strong><span style="font-size: 12pt;">()</span><br /> <span style="color: #008080; ">17</span> {<br /> <span style="color: #008080; ">18</span>     mpf_clear(s_base100);<br /> <span style="color: #008080; ">19</span>     mpf_clear(s_one);<br /> <span style="color: #008080; ">20</span> }<br /> <span style="color: #008080; ">21</span> <br /> <span style="color: #008080; ">22</span> <span style="color: #0000FF; ">static</span> <span style="color: #0000FF; ">void</span> <strong style="font-size: 12pt; color: #800000;">orcl_raw2number</strong>(unsigned <span style="color: #0000FF; ">char</span> *data, unsigned <span style="color: #0000FF; ">int</span> len, mpf_t result)<br /> <span style="color: #008080; ">23</span> {<br /> <span style="color: #008080; ">24</span>     unsigned <span style="color: #0000FF; ">int</span> sign = *data, digit, i;<br /> <span style="color: #008080; ">25</span>     <span style="color: #0000FF; ">int</span> exp = sign>=128 ? sign-193 : 62-sign;<br /> <span style="color: #008080; ">26</span>     <span style="color: #0000FF; ">int</span> exp_val;<br /> <span style="color: #008080; ">27</span>     mpf_t tmp;<br /> <span style="color: #008080; ">28</span> <br /> <span style="color: #008080; ">29</span>     mpf_init2(tmp, MAX_PREC);<br /> <span style="color: #008080; ">30</span>     mpf_init2(result, MAX_PREC);<br /> <span style="color: #008080; ">31</span> <br /> <span style="color: #008080; ">32</span>     <span style="color: #0000FF; ">if</span>(sign & 0x80){<br /> <span style="color: #008080; ">33</span>         <span style="color: #0000FF; ">for</span>(i=1; i<len; ++i){<br /> <span style="color: #008080; ">34</span>             digit = data[i] - 1;<br /> <span style="color: #008080; ">35</span>             assert(0<=digit && digit<=99);<br /> <span style="color: #008080; ">36</span> <br /> <span style="color: #008080; ">37</span>             exp_val = exp - i + 1;<br /> <span style="color: #008080; ">38</span>             <span style="color: #0000FF; ">if</span>(exp_val < 0){ <br /> <span style="color: #008080; ">39</span>                 mpf_pow_ui(tmp, s_base100, -exp_val);<br /> <span style="color: #008080; ">40</span>                 mpf_div(tmp, s_one, tmp);    <br /> <span style="color: #008080; ">41</span>             }<span style="color: #0000FF; ">else</span><br /> <span style="color: #008080; ">42</span>                 mpf_pow_ui(tmp, s_base100, exp_val);<br /> <span style="color: #008080; ">43</span>                                 <br /> <span style="color: #008080; ">44</span>             mpf_mul_ui(tmp, tmp, digit);<br /> <span style="color: #008080; ">45</span>             mpf_add(result, result, tmp);<br /> <span style="color: #008080; ">46</span>         }<br /> <span style="color: #008080; ">47</span>     <br /> <span style="color: #008080; ">48</span>     }<span style="color: #0000FF; ">else</span>{<br /> <span style="color: #008080; ">49</span>         --len; <span style="color: #008000; ">//</span><span style="color: #008000; ">ignore the last byte</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">50</span> <span style="color: #008000; "></span>        <span style="color: #0000FF; ">for</span>(i=1; i<len; ++i){<br /> <span style="color: #008080; ">51</span>             digit = 101 - data[i];<br /> <span style="color: #008080; ">52</span>             assert(0<=digit && digit<=99);<br /> <span style="color: #008080; ">53</span> <br /> <span style="color: #008080; ">54</span>             exp_val = exp - i + 1;<br /> <span style="color: #008080; ">55</span>             <span style="color: #0000FF; ">if</span>(exp_val < 0){ <br /> <span style="color: #008080; ">56</span>                 mpf_pow_ui(tmp, s_base100, -exp_val);<br /> <span style="color: #008080; ">57</span>                 mpf_div(tmp, s_one, tmp);    <br /> <span style="color: #008080; ">58</span>             }<span style="color: #0000FF; ">else</span><br /> <span style="color: #008080; ">59</span>                 mpf_pow_ui(tmp, s_base100, exp_val);<br /> <span style="color: #008080; ">60</span>                                 <br /> <span style="color: #008080; ">61</span>             mpf_mul_ui(tmp, tmp, digit);<br /> <span style="color: #008080; ">62</span>             mpf_add(result, result, tmp);<br /> <span style="color: #008080; ">63</span>         }<br /> <span style="color: #008080; ">64</span> <br /> <span style="color: #008080; ">65</span>         mpf_neg(result, result);<br /> <span style="color: #008080; ">66</span>     }<br /> <span style="color: #008080; ">67</span>     <br /> <span style="color: #008080; ">68</span>     mpf_clear(tmp);<br /> <span style="color: #008080; ">69</span> }</div> <strong style="font-size: 13pt;"><br /> 试用例<br /> </strong>   试?23456.789?123456.789、Oracle Number实际最大最倹{Oracle Number理论最大最?br /> <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080; "> 1</span> <span style="color: #0000FF; ">int</span> <span style="color: #800000; font-size: 13pt;"><strong>main</strong></span><span style="color: #0000FF; ">(int</span> argc, <span style="color: #0000FF; ">char</span> *argv[])<br /> <span style="color: #008080; "> 2</span> {<br /> <span style="color: #008080; "> 3</span>     <span style="color: #0000FF; ">int</span> n = 19;<br /> <span style="color: #008080; "> 4</span>     <span style="color: #0000FF; ">char</span> buf[256];<br /> <span style="color: #008080; "> 5</span>     mpf_t r;<br /> <span style="color: #008080; "> 6</span> <br /> <span style="color: #008080; "> 7</span>     <strong style="color: #800000;">init_mpf_globals</strong>();<br /> <span style="color: #008080; "> 8</span> <br /> <span style="color: #008080; "> 9</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">123456.789</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">10</span> <span style="color: #008000; "></span>    unsigned <span style="color: #0000FF; ">char</span> data[] = {0xc3,0xd,0x23,0x39,0x4f,0x5b};    <br /> <span style="color: #008080; ">11</span>     <span style="color: #800000;"><strong>orcl_raw2number</strong></span>(data, <span style="color: #0000FF; ">sizeof</span>(data), r);<br /> <span style="color: #008080; ">12</span>     gmp_snprintf(buf, <span style="color: #0000FF; ">sizeof</span>(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);<br /> <span style="color: #008080; ">13</span>     printf("result: %s\n", buf);<br /> <span style="color: #008080; ">14</span>     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">15</span>     mpf_clear(r);<br /> <span style="color: #008080; ">16</span> <br /> <span style="color: #008080; ">17</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">-123456.789</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">18</span> <span style="color: #008000; "></span>    unsigned <span style="color: #0000FF; ">char</span> data2[] = {0x3c,0x59,0x43,0x2d,0x17,0xb,0x66};<br /> <span style="color: #008080; ">19</span>     <strong style="color: #800000;">orcl_raw2number</strong>(data2, <span style="color: #0000FF; ">sizeof</span>(data2), r);<br /> <span style="color: #008080; ">20</span>     gmp_snprintf(buf, <span style="color: #0000FF; ">sizeof</span>(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);<br /> <span style="color: #008080; ">21</span>     printf("result: %s\n", buf);<br /> <span style="color: #008080; ">22</span>     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">23</span>     mpf_clear(r);<br /> <span style="color: #008080; ">24</span> <br /> <span style="color: #008080; ">25</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">0</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">26</span> <span style="color: #008000; "></span>    unsigned <span style="color: #0000FF; ">char</span> zero[] = {0x80};<br /> <span style="color: #008080; ">27</span>     <strong style="color: #800000;">orcl_raw2number</strong>(zero, <span style="color: #0000FF; ">sizeof</span>(zero), r);<br /> <span style="color: #008080; ">28</span>     gmp_snprintf(buf, <span style="color: #0000FF; ">sizeof</span>(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);<br /> <span style="color: #008080; ">29</span>     printf("result: %s\n", buf);<br /> <span style="color: #008080; ">30</span>     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">31</span>     mpf_clear(r);<br /> <span style="color: #008080; ">32</span> <br /> <span style="color: #008080; ">33</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">test actual max value:9999<img src="http://www.shnenglu.com/Images/dot.gif" alt="" />9(the number of 9 is 38)</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">34</span> <span style="color: #008000; "></span>    unsigned <span style="color: #0000FF; ">char</span> max_data[] = {0xd3,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64};<br /> <span style="color: #008080; ">35</span>     <strong style="color: #800000;">orcl_raw2number</strong>(max_data, <span style="color: #0000FF; ">sizeof</span>(max_data), r);<br /> <span style="color: #008080; ">36</span>     gmp_snprintf(buf, <span style="color: #0000FF; ">sizeof</span>(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);<br /> <span style="color: #008080; ">37</span>     printf("result: %s\n", buf);<br /> <span style="color: #008080; ">38</span>     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">39</span>     mpf_clear(r);<br /> <span style="color: #008080; ">40</span> <br /> <span style="color: #008080; ">41</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">test actual min value:-9999<img src="http://www.shnenglu.com/Images/dot.gif" alt="" />9(the number of 9 is 38)</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">42</span> <span style="color: #008000; "></span>    unsigned <span style="color: #0000FF; ">char</span> min_data[] = {0x2c,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x66};    <br /> <span style="color: #008080; ">43</span>     <strong style="color: #800000;">orcl_raw2number</strong>(min_data, <span style="color: #0000FF; ">sizeof</span>(min_data), r);<br /> <span style="color: #008080; ">44</span>     gmp_snprintf(buf, <span style="color: #0000FF; ">sizeof</span>(buf), "%Ff\n\t%.*Ff(%d digits)", r, n, r, n);<br /> <span style="color: #008080; ">45</span>     printf("result: %s\n", buf);<br /> <span style="color: #008080; ">46</span>     printf("\t"); mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">47</span>     mpf_clear(r);<br /> <span style="color: #008080; ">48</span> <br /> <span style="color: #008080; ">49</span>     <strong style="color: #800000;">clear_mpf_globals</strong>();<br /> <span style="color: #008080; ">50</span> <br /> <span style="color: #008080; ">51</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">test max oracle number value</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">52</span> <span style="color: #008000; "></span>    mpf_init2(r, 256);<br /> <span style="color: #008080; ">53</span> <br /> <span style="color: #008080; ">54</span>     mpf_set_str(r, "1e125", 10);<br /> <span style="color: #008080; ">55</span>     mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">56</span>     gmp_printf("%Ff\n", r);<br /> <span style="color: #008080; ">57</span>     <br /> <span style="color: #008080; ">58</span>     <span style="color: #008000; ">//</span><span style="color: #008000; ">test min oracle number value</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">59</span> <span style="color: #008000; "></span>    mpf_set_str(r, "-1e125", 10);<br /> <span style="color: #008080; ">60</span>     mpf_out_str(NULL, 10, 0, r); printf("\n");<br /> <span style="color: #008080; ">61</span>     gmp_printf("%Ff\n", r);<br /> <span style="color: #008080; ">62</span> <br /> <span style="color: #008080; ">63</span>     mpf_clear(r);<br /> <span style="color: #008080; ">64</span> <br /> <span style="color: #008080; ">65</span>     <span style="color: #0000FF; ">return</span> 0;<br /> <span style="color: #008080; ">66</span> }</div>    <strong>输出如下<br /> </strong>   <img src="http://www.shnenglu.com/images/cppblog_com/qinqing1984/oracle_number_parse_test_output.png" width="1183" height="285" alt="" /><img src ="http://www.shnenglu.com/qinqing1984/aggbug/217292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qinqing1984/" target="_blank">春秋十二?/a> 2020-05-08 12:23 <a href="http://www.shnenglu.com/qinqing1984/archive/2020/05/08/217292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZVSS热备SQL Server的架构及(qing)应用http://www.shnenglu.com/qinqing1984/archive/2020/05/02/217276.html春秋十二?/dc:creator>春秋十二?/author>Sat, 02 May 2020 08:31:00 GMThttp://www.shnenglu.com/qinqing1984/archive/2020/05/02/217276.htmlhttp://www.shnenglu.com/qinqing1984/comments/217276.htmlhttp://www.shnenglu.com/qinqing1984/archive/2020/05/02/217276.html#Feedback0http://www.shnenglu.com/qinqing1984/comments/commentRss/217276.htmlhttp://www.shnenglu.com/qinqing1984/services/trackbacks/217276.htmlZ么用VSS
   VSS是Windowspȝ的卷影像拯服务Q用于解军_下问题:(x)
       ◆ 许多备䆾工具涉及(qing)打开文g
       ◆ 但是若一个应用程序已l以独占方式打开文gq进行访问时Q备份工具则不能讉K该文?br />        ◆ 即备䆾工具能够讉K已打开的文Ӟ也可能造成备䆾文g的不一致?br />    在实际数据灾备中Q主厂商实现SQL Server的热备ƈ不会(x)使用数据库自带的backup database/backup log命o(h)Q因U方式在应急容?此时源数据库已宕?挂蝲数据时要先还原,而还原要q接数据库运?span style="color: e93366;">restore database/restore log命o(h)Q这样就需要部|一台机器装上SQL Server专用于还原,不仅增大了成本而且廉?span style="color: e93300;">RTOQ而用VSSQ备份的是SQL Server的数据文件及(qing)日志文gQ在应急容灾挂载时可直接打开q用于增删改查,无须q原Q免M机器成本q低了RTOQ只存在数据库挂载时的事务恢复时_(d)?br />
VSS架构
   VSS包括Requestor、Writer、Provider和VSS核心模块四部分,如下图所C?br />                             
   Requestor在本文中表示热备份应用程序;Writer主要功能是保证数据的一致性,使得那些能够感知影像拯的应用程序能够接收到ȝQfreezeQ和解冻QthawQ通知Q以保其文件的备䆾拯是内在一致的Q在本文中即指SQL Server自带?span style="color: #ff00ff;">SQL WriterQProvider主要功能是创建媄(jing)像拷贝即打快照,允许ISV特定的存储方案与影像拯服务集成hQ在本文中即volsnap.sys存储qo(h)型驱动程序,位于文gpȝ和卷理器之_(d)VSS核心模块卛_中的卷媄(jing)像拷贝服务,主要功能是协调各个模块的协作q行Qƈ提供创徏?qing)管理卷影像拯的API接口?br />
VSS原理CZ
                          
   无论何时Q当卷媄(jing)像拷贝驱动程序看C个针对原始卷的写操作Ӟ它把要被修改的扇区的内容复制到一个与影像L(fng)兌的、由面文g支持的内存区?     
      ◆ 对于已修Ҏ(gu)区的影像卯操作Q从该内存区中读取数?br />       ◆ 对于未修Ҏ(gu)区的影像卯操作Q从原始卷中d

备䆾应用E序、Provider和SQL Writer的局?br />    ◆ 只能备䆾W(wng)indowspȝ支持的本地文件系l上的文Ӟ不支持远E共享或交叉挂蝲的文件系l?br />    ◆ 对于pȝ提供?Windowspȝ默认自带的ProviderQ用写时拷贝技?Q被拯的源卷不必是NTFSP但媄(jing)像卷必须是NTFS?br />    ◆ SQL Writer支持全量备䆾?qing)恢复、支持差异备份及(qing)恢复和Copy Only备䆾Q但不支持备份连l事务日志、文件和文gl,不支持页恢复

怎样使用VSS
   微Y官网提供的VSS SDK 7.2Q?a target="_blank">https://www.microsoft.com/en-us/download/details.aspx?id=23490Q中自带?span style="color: S00000;">vshadow?span style="color: S00000;">betest工具源码Q经q笔者修正一些bug(win 10 + vs2010)QƈZ备䆾配置方便原来的文本换成xml格式Q成功地实现了SQL Server的全量热备及(qing)恢复、差量热备及(qing)恢复
   vshadow用法
      以管理员w䆾在ms-dosH口下执行vshadow.exe /?Q可得到所有的帮助
      CZ
         可用vshadow -wm获取当前pȝ所有写者的元数据,再从中查找SQL Server Writer的写者ID?qing)它下面COMlg的逻辑路径和名U?br />     
   betest用法
      以管理员w䆾在ms-dosH口下执行betest.exe /?Q可得到所有的帮助
      CZ
         1. 全量备䆾SQL Server
             betest.exe /v /b /t FULL /s backupfull.xml  /d f:\backupfull /c SQLWriter.xml
                /v -- 输出详细信息Q可选的
                /b -- 备䆾
                /t -- 备䆾cd
                /s -- 备䆾/恢复lgXML格式文档Q内含写者及(qing)其下lg的元数据Q非帔R要)
                /d -- 备䆾目录
                /c -- 相关写者的配置文gQ文件内含写者ID?qing)其下COMlg的逻辑全\径名
     
           全量恢复SQL Server
             betest.exe /v /r /s backupfull.xml  /d f:\backupfull  /c SQLWriter.xml
                /r -- 恢复
                其它选项说明同上Q下?nbsp;
    
         2. 差异备䆾SQL Server
            betest.exe /v /b /t DIFFERENTIAL /s backupdiff.xml /pre backupfull.xml /d f:\backupdiff /c SQLWriter.xml
               /pre -- 表示前次基准的全量备份生成的lgXML格式文档
    
           差异恢复SQL Server 
              a) betest.exe /v /r /AdditionalRestores /s backupfull.xml /d f:\backupfull /c SQLWriter.xml
                     /AdditionRestores -- 用于差异恢复的选项Q表C全量后面需要紧跟差异恢复才能完成数据库恢复
              b) betest.exe /v /r /s backupdiff.xml /d f:\backupdiff /c SQLWriter.xml 
                     注意Q此?s跟的是差异备份生成的backupdiff.xml文gQ?d跟的是差异备份目?br />
         3. SQL Writer配置
             xml格式说明
               writer节点
                  id属?nbsp;                                ---  写者唯一ID
                  server_name属?nbsp;                ---  SQLServer服务?br />                   stop_restore_start属?可? --- 表示恢复时是否先停止数据库服务再启动Qyes表示先停再启Qno则反之,q个用于恢复pȝ数据库masterQ因为master不支持在U恢?br />                   component节点 
                     pathname属?                 --- 逻辑路径?br />                      file节点
                        src_path节点                 --- SQL Server文g所在\径的匚w模式
                        alternate_path节点        --- 恢复时的备选\径,用于合成差异增量
    
             CZ
                <?xml version="1.0" encoding="utf-8"?>
                <betest>
                   <writer id="{a65faa63-5ea8-4ebc-9dbd-a0c4db26912a}"  service_name="MSSQLSERVER" stop_restore_start="no">   
                      <component pathname="DESKTOP-JUP320L\master">                                                 
                         <file>
                            <src_path>E:\*...</src_path>
                            <alternate_path>f:\sqlserver\</alternate_path>              
                         </file>
                     </component>
                     <component pathname="DESKTOP-JUP320L\model">
                        <!--file>
                           <src_path>E:\*...</src_path>
                           <alternate_path>f:\sqlserver\</alternate_path>
                        </file-->
                     </component>    
                     <component pathname="DESKTOP-JUP320L\test">
                        <!--file>
                           <src_path>E:\*...</src_path>
                           <alternate_path>f:\sqlserver\</alternate_path>
                        </file-->
                     </component>
                   </writer>
                 </betest>

]]>
MySQL和Oracle在日志子pȝ?qing)热备方面的?gu)心得http://www.shnenglu.com/qinqing1984/archive/2020/04/21/217247.html春秋十二?/dc:creator>春秋十二?/author>Tue, 21 Apr 2020 03:19:00 GMThttp://www.shnenglu.com/qinqing1984/archive/2020/04/21/217247.htmlhttp://www.shnenglu.com/qinqing1984/comments/217247.htmlhttp://www.shnenglu.com/qinqing1984/archive/2020/04/21/217247.html#Feedback0http://www.shnenglu.com/qinqing1984/comments/commentRss/217247.htmlhttp://www.shnenglu.com/qinqing1984/services/trackbacks/217247.htmlhttps://zhuanlan.zhihu.com/p/53037796Q后的心得:(x)
与oracle日志子系l异曲同工的差异
 1. I洞Q对于ƈ发会(x)话copy重做日志造成的空z,oracle是由lgwr判断q等待持有redo copy闩锁的会(x)话释攑֐Q这时空z已被填充,可以刷到盘了;mysql则是由log writerU程监测到空z被填充后,再写入一D连l最大lsn的日志到盘
 2. io方式Qoracle的lgwr是direct ioQmysql的log writer是写到os的page cacheQ后q立的log flusherU程L(fng)Q比oracle多了一个过E?/div>
 3. 唤醒?x)?/span>Qoracle由lgwr扫描所有等待的?x)话Q只唤醒满写入条g(事务提交log已刷?的会(x)话;mysql则由独立的log flush notifier通过满条g对应的分片消息队列来唤醒Q比oracle多了一个过E?/div>
ȝQmysql通过原子变量来管理全局log buffer的几个内存位|来实现无锁化,而原子操作在多核上仍不利于线性扩展。oracle的闩锁也存在cM问题Q但通过U有redo~存和多个全局log buffer(相关闩锁量与cpu核数正比)Q来提升了扩展性。故整体上oracle更优

阅读《MySQL/InnoDB数据克隆插g(clone plugin)实现剖析》(https://zhuanlan.zhihu.com/p/76255304Q后的心得:(x)
与oracle老式热备异曲同工的差?/strong>
 1. pageq踪Qoracle老式热备实际当每行更新时整个关联的page记录在redo日志中;mysql热备则是记录变化page的id在单独一个地方,用于page copy阶段从buffer pooldq发送页数据到备?/div>
 2. redo归档Qoracle老式热备在拷贝数据文件的全过E,只要数据文g被修改就?x)有redo归档Qmysql热备则仅在page copy阶段启用redo归档Q可看做是(f)时的
 3. 一致性恢?/span>Qoracle老式热备存在数据块分ȝ象,Ҏ(gu)应用被冻lscn?qing)日志序列号后的redo log来恢复;mysql则通过page copy?qing)应用clone lsn后的redo log来恢?/div>
ȝQoracle老式热备必须处于归档模式Q由于记录整块而非行变化,因此重做日志写放大而增加了cpu和io的开销Q由于可能判断ƈ修复分离的块Q因此g长了恢复旉Qmysql通过pageq踪和(f)时redo归档来减应用redo的体量而羃短了恢复旉。故mysql热备整体更优Q但相对oracle的现代rman备䆾则ƈ不更?/div>


]]>关于数据库的一些学?fn)研I心?/title><link>http://www.shnenglu.com/qinqing1984/archive/2019/11/06/216969.html</link><dc:creator>春秋十二?/dc:creator><author>春秋十二?/author><pubDate>Wed, 06 Nov 2019 03:29:00 GMT</pubDate><guid>http://www.shnenglu.com/qinqing1984/archive/2019/11/06/216969.html</guid><wfw:comment>http://www.shnenglu.com/qinqing1984/comments/216969.html</wfw:comment><comments>http://www.shnenglu.com/qinqing1984/archive/2019/11/06/216969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/qinqing1984/comments/commentRss/216969.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/qinqing1984/services/trackbacks/216969.html</trackback:ping><description><![CDATA[<div>1. <strong style="color: red;">l定变量</strong>作ؓ(f)一U优化查询处理的Ҏ(gu)Q在性能上有利有弊,是一把双刃剑。它的优势在于可以共享库~存中的父游标,从而避免了解析及(qing)相关的开销Q劣势在于因l定变量扫视增加了查询优化器选择(非常)低效执行计划的风险,即支持自适应游标׃nQ也引入了游标感知判断和谓词选择率估的代h(hun)Q而且在生成高效的执行计划前至有一ơ是无效率的。因此,是否使用l定变量Q需要衡量实际字面g处理数据量带来的解析执行的收益与损害Q当损害大于收益时就不应该用,反之当处理较?yu)数据硬解析耗时比执行多Ӟ可以用了<br /><br />2. <strong>存储快照</strong>一般有三种层次Q物理卷、文件系l和应用E序</div><div>   ◆ 物理卷快照基于卷扇区映射表实玎ͼ宜采用CoFW法,因ؓ(f)它不必每ơ写io都去遍历映射表,比RoFW?/div><div>   ◆ 文gpȝ快照Zinode?wi)即元数据复制实玎ͼ每当写io时更新快照或源inode的指向,必要时向上回溯至根inode。有的文件系l比如NetApp公司的WAFL则更优,只须复制根inodeQ因为每ơ写io时它?x)变但其下所有的inode不会(x)?/div><div>   ◆ 应用E序快照最典型的就是数据库Q原理本质与上述两种一PZ|变位图,当page首次(相对于快照创建时?改变时拷贝到快照文g(一U稀疏文?Q另外当撤消未提交事务或回滚事务时也?x)发生拷?此时快照慢慢不再E?Q这是ؓ(f)了保证快照的可用一致?br /><br />3. <strong style="color: red;">数据块的加锁</strong>有单机和分布式两U情景,前者是Z同步单实例事务的q发Q后者是Z协调分布式事务的同步Qƈ与缓存一致性协议紧密联pRundo,redo,undo/redo三种日志Ҏ(gu)据脏块与提交日志记录落盘的顺序要求各不同Q因此恢复方式不同。脱服务器备份架构比较好Q具有不占用应用服务器资源的优势Q而微软的vss可传输卷影拷贝提供了q一支持Q见其技术的先进前瞻?br /><br /><div>4. Oracle?strong style="color: red;">实例恢复</strong>完全靠在UK做日志,介质恢复必须靠归档重做日志,以及(qing)在线重做日志。然而在UK做日志是有限数量的,那么Oracle是怎样保证宕机l实例恢复后不丢数据Q答案是(g)查点。检查点是数据库中一个很重要的机Ӟ被重做日志切换触发,由DBWn执行h脏块Qƈ清除老的无用的在UK做日志,以允许被覆盖<br /><br /><div>5. Linux内核的swap高速缓存和其它的缓?比如page~存)不太一P因ؓ(f)它存在的主要原因不是Z减少盘I(y)O提高性能Q而是解决换入换出׃n匿名同步即q发swap的问题。那么它是唯一的方法吗Q不一定,可以遍历所有的anon_vma链表Q查扑֌名页对应的页框是否已建立Q但该方法没有swap~存快。当?dng)在换入操作很多的情景Qswap~存实能提高系l性能<br /><br />6. Linux内存回收的核心是LRU链表QOracle?span style="color: red;"><strong>buffer cache</strong></span>也有个LRUQ这两种LRU的共同点是引用计?标志)和非z跃链表Q引用计C(x)影响一个对象是否移到非z跃链表Q非z跃链表用于回收或覆盖这个对象。对于Linuxq个对象是页框,Ud非活跃链表取决于swap tendencyQ而Oracle则是数据块buffer?qing)其TCH<br /><br />7. Linux内核中的反向映射让我惌v了Oracle中的<strong style="color: red;">反向键烦(ch)?/strong>Q它们的共同炚w是ؓ(f)了高性能Q前者是Z快速定位引用同一|的所有页表项Q从而方便共享内存的回收Q后者是Z减少右侧索引叶块的竞争,从而降低缓冲区忙等待、提高ƈ发量<br /><br />8. <strong style="color: red;">mvcc</strong>与read uncommitted(URU)隔离U别的关pȝ竟如何?q取决于C数据库的实现。对于OracleQRU和RC的读实现都基于mvcc实现Q换句话说Oracle其实没有脏读Q对于MySQL innodb引擎Qmvcc不适用于RU而只适用于RC/RRU别Q因为RC/RR必须d修改已提交的数据Q但基准点不同,前者查询开始时、后者事务开始时Q而RU则可d未提交的数据Q当然用mvcc模拟实现RU应该也可以,只需要读取当前新版本而非旧版?br /><br />9. 借助内核page cache的数据库或者存储引擎,一定程度上Ԍ是粗暴懒惰的表现Q这?x)导致系l负载比较重的情况下Qio性能很差。所以ؓ(f)高性能Q必d处理好direct ioQ设?strong style="color: red;">self cache</strong>Q这样一来,避免了费在原先内栔R~存的页框,避免处理内核늼存和预读的多余指令而提高了pȝ调用read和write的效率,同时减少了一ơ数据拷?br /><br />10. <strong style="color: red;">SQL半连?/strong>的本质是在内q接的基上对内表去重Q即使内表有W合多个q接条g的元l,也只匚w一条,从而减了q接q回的结果集。一般地Q简单的in、exists和any子句Q都采用半连接实玎ͼ但若内表本n保证了唯一性,则半q接可消除{为内q接实现Q或者内表数据量很小且外表存在烦(ch)引,那么也会(x)消除半连接,生成由内表驱动外表,外表走烦(ch)引的执行计划。由此一例看出,SQL优化器偏爱内q接Q因为内q接带来了驱动表选择和谓词下推的灉|Q便于生更优的执行计划<br /><br />11. 从Oracle数据库内核角度讲Q?strong style="color: red;">游标</strong>代表SQL语句的句柄,包含了依赖对象及(qing)执行计划{信息,它相当于linux的文件描q符和windows的句柄。打开或缓存的游标是指对应SQL语句所占的内存(父游标句柄、父?和子游标句柄的chunk)被加上kgl lock和pin锁,意味着W三ơ后解析同样的SQL不必再从library cache hash chain中加锁查找而直接从PGA的子?地址中获取ƈ调用执行计划Q如此优化提高了q发度加快了查询Q这正是软Y解析QY软解析前必须软解?ơ,目的是将library cache的执行计划在PGA中做一份链接,软解析前必须解析,目的是将执行计划攑֜library cache中。然而,如果׃n池空闲内存不I或者依赖对象发生DDL操作D执行计划失效Q那么执行计划所占chunk可以被覆盖释放,q样一来,??解析时就需要重新生成执行计划了<br /><br />12. <strong style="color: red;">Oracle的内存管?/strong>_略地类gLinux内核Q所不同的是内存分配单元Q前者叫granule通常大小4M~16MQ后者叫page通常4KQ数据块~冲的分配类g伴算法,׃n?主要用于sql~存)的chunk分配cMslab法Q共享池中的保留池类似基于slab的内存池<br /><br />13. Oracle数据库究竟是怎样构徏?strong style="color: red;">数据块的M致?/strong>版本Q这是个比较复杂、细致和有趣的问题,核心程如下</div><div>   ◆ 克隆数据块,若不存在则先从磁盘读Q下面几步以克隆块ؓ(f)目标</div><div>   ◆ Ҏ(gu)ITL中的flag?qing)lckQ对所有已提交的事务做清除操作Q即延迟块清除。gq块清除Z获取__的提交SCN填充到ITLQ分2U情况,若事务表槽没被覆盖,则直接用其提交SCNQ否则先从事务控制区获取SCNQƈ判断对于上界提交是否__Q若不够则需要回滚事务表一直找到合适的SCN或报错ORA-01555</div><div>   ◆ Ҏ(gu)ITL中的ubaQ反向更Ҏ(gu)有未提交的事务,也就是应用事务的undo记录</div><div>   ◆ Ҏ(gu)ITL中的SCNQ不断反向更改大于目标SCN的已提交事务Q直至遇见合适的已提交事务。这里也是应用undo记录Q但不同的是Q除了应用行数据Q还?x)从事务的第一个undo记录扑ֈ先前卛_一个已提交事务的ITLҎ(gu)贝回当前块的对应ITL?br /><br />14. Oracle的多版本控制机制Qؓ(f)dml不仅提供了一致且正确的结果,q提高了q发性,可谓鱼和熊掌兼得。那么它的缺Ҏ(gu)什么?可能?x)导致热表的IO增高Q因一致性需要不断回滚多个事务对数据块的修改Q直到查询开始时的数据。事务隔ȝ别read committed与read uncommitted的相同是不会(x)脏读Q区别是前者会(x)不可重复Lq读<br /><br />15. Sql*plus?strong style="color: red;">ARRAYSIZE</strong>Ҏ(gu)询数据性能有重要的影响Q这个D大过都不好Q而是要接q一个数据块所拥有的行敎ͼ如此仅一ơ逻辑IO拿C一批行。那么设|合适的ARRAYSIZE׃定能提高性能吗?不一定,q要看所查询的表使用了什么烦(ch)引列?qing)表数据在磁盘上的物理布局Q若数据分散卌因子低Q则优化器会(x)选用全表而非索引区间扫描Q去执行q个查询<br /><br />16. <strong style="color: red;">IOT?/strong>如果为非主键列再建烦(ch)引,那么成二索引。这时候查询数据,需要两ơ扫描,一是扫描二U烦(ch)引得到IOT中的位置Q二是扫描IOT本n匚w那个位置Q之所以这h因ؓ(f)行记录在IOT中的位置?x)变。而堆l织表,仅需一ơ扫描烦(ch)引结构,得到rowidQ再直接ȝ盘获取行记录。因此IOT上再ZU烦(ch)引,q明智的选择<br /><br />17. 相容性矩阉|锁调度的核心结? L一个无环优先图的封锁调度都是冲H可串行化的; Z?wi)协议的无环优先囄锁调度Q其整个事务集合的Q意一个拓扑顺序都是等价可串行化的<br /><br />18. ȝ解决数据?strong style="color: red;">丢失更新</strong>问题的方?/div><div>     ◆ 对于表不?x)被?zhn)观锁锁定的情景Q用基于select+update的乐观锁Ҏ(gu)Q查询保存前映像Q以便定位更新。前映像列可为全列,或新增一个时间戳列作为版本列</div><div>     ◆ 对于表可能会(x)被?zhn)观锁锁定的情景?x)使用select…for update nowait+update的?zhn)观锁?gu)Q可以以全列的hash(虚拟?来定位更?br /><br />19. 如果能够在备库上打开闪回Q那么就可以做到既让生pȝ没有承担闪回的开销Q又能快速地为错误或故障恢复C前某个时刅R一举两得比较完,重做日志的创C用真是太了<br /><br />20. Oracle?strong style="color: red;">索引聚簇?/strong>是个创新Q它能将多个不同表的行按照烦(ch)引列存储在同一块中Q属于物理上的joinQ这样一来既可减data buffer~存的块数而提高效率,又可提高多个相关表连接查询的性能Q比如通过外键U束的父子表。最典型的应用就是数据字典,数据字典对于查询优化的成本估很重要Q由此可见oracle的设计之明智Qmysql的innodb只有索引l织表,sql server有堆表和索引l织表,但它们都没有索引聚簇?br /><br />21. 分布式事务处理是工程N。Oracle?span style="color: red;"><strong>serializable串行隔离U别</strong></span>以乐观锁实现Q所以ƈ发度与非串行相当Q需要注意的是:(x)串行q不是说一个事务提交了才能处理下一个,而是多个事务间没有冲H表现地像只有一个事务在q行Q否则Oracle的serializableU别׃存在抛出ORA-08177错误?br /><br />22. 理清<span style="color: red;"><strong>read uncommitted</strong></span><span style="color: #000000;">事务隔离U别</span>的锁{略Q读不加׃n锁,写加排它锁直x交,q里的锁是指lockQ块的缓冲区q发操作必须加锁Q这里的锁是指latchQ若不加Q那脏读d的数据可能是错的。脏读隔ȝ别允许读修改但未提交的行记录Q这意味着M能被写阻塞,也不能阻塞写Q所以不?x)申请共享锁Q显式锁定读除外Q?br /><br />23. 与MySQL不同QOracle?span style="color: red;"><strong>行锁</strong></span>无需索引列的限制Q是真正的行锁,其实Cؓ(f)数据块的属性而非传统的锁理器,但是它需要在事务commit或rollback时才释放Q如果存在慢sqlQ那么导致的d?x)比较严?br /><br />24. 隔离是实现安全的一U办法,其结果常被称?#8220;沙箱”。从q个意义上讲Oracle很明智,因ؓ(f)它的事务没有也不需要read uncommitted隔离U别QOracle最低且默认的隔ȝ别是<span style="color: red;"><strong>read committed</strong></span>Q因为它有基于undo的多版本控制Q天生非d读,Ҏ(gu)不会(x)脏读。我想不出read uncommitted有什么好处,除了非阻塞读?qing)可能的高ƈ发,要}慎脏L危险不安全的<br /><br />25. windows内存映射和linux内存映射的实现机制不太一P前者用了内存区section的专用数据结构而不像后者重用了늼存,内存区的映射完全由内存管理器负责包括物理分配及(qing)脏页面写入器Q与~存理器无养I~存理器基于内存管理器l护了文件块数据的视图,q提供了自己的gq写入器。这两种写入器即回刷Q独立ƈ行地工作</div></div></div><img src ="http://www.shnenglu.com/qinqing1984/aggbug/216969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/qinqing1984/" target="_blank">春秋十二?/a> 2019-11-06 11:29 <a href="http://www.shnenglu.com/qinqing1984/archive/2019/11/06/216969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.cfgcurn.cn" target="_blank">þùƷ99Ʒ</a>| <a href="http://www.iview-inc.com.cn" target="_blank">þþþþþۺ</a>| <a href="http://www.iamwilson.cn" target="_blank">þþƷž޾Ʒ</a>| <a href="http://www.mdz8.cn" target="_blank">ާѡþþþƷ</a>| <a href="http://www.wangjunyao.cn" target="_blank">99þþƷѿ</a>| <a href="http://www.enkids.cn" target="_blank">Ʒþþþù</a>| <a href="http://www.w-sh.cn" target="_blank">97Ʒ˾þþô߽</a>| <a href="http://www.92mo.cn" target="_blank">MM131޹Ůþ</a>| <a href="http://www.ksszzyy.cn" target="_blank">91Ʒ91þþþþ</a>| <a href="http://www.abctoy.com.cn" target="_blank">ĻۺϾþ2</a>| <a href="http://www.s88w.cn" target="_blank">þù˾Ʒ鶹</a>| <a href="http://www.jlauyh.cn" target="_blank">ɫվþav</a>| <a href="http://www.sz5111.cn" target="_blank">ԸߺþþþþþþAAAAA</a>| <a href="http://www.icaew.com.cn" target="_blank">þþƷĻ</a>| <a href="http://www.x705.cn" target="_blank">ŷ츾þþþþò</a>| <a href="http://www.bjnyjdxcj.cn" target="_blank">þ99Ʒþþþþ</a>| <a href="http://www.hxstone.com.cn" target="_blank">þѸƵ</a>| <a href="http://www.mofeigzs.cn" target="_blank">þ91ᆱƷ2020</a>| <a href="http://www.bestlevering.cn" target="_blank">պ޹ۺϾþþ</a>| <a href="http://www.huaigutang.cn" target="_blank">þﶼǾƷ</a>| <a href="http://www.alichengde.cn" target="_blank">þþƷ</a>| <a href="http://www.swfun.com.cn" target="_blank">ŷ˾þƬ</a>| <a href="http://www.wxpie.cn" target="_blank">þŮƵ</a>| <a href="http://www.jkwovf.cn" target="_blank">þһ</a>| <a href="http://www.jiujimenye.cn" target="_blank">޳˾Ʒþ</a>| <a href="http://www.lsjtht.cn" target="_blank">þþþþþۺձ</a>| <a href="http://www.acesolo.cn" target="_blank">avպƷþþþþa</a>| <a href="http://www.gznfrc.com.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.philadelphiausa.cn" target="_blank">Ļþþ</a>| <a href="http://www.ksxhsd.cn" target="_blank">һþöۺ</a>| <a href="http://www.kkha.cn" target="_blank">77777ҹþö</a>| <a href="http://www.fwrld.cn" target="_blank">wwwԾþþcom</a>| <a href="http://www.ems1.cn" target="_blank">Ĺ˾Ʒþ޾ƷA뾫Ʒ </a>| <a href="http://www.zhangyiping.cn" target="_blank">˾Ʒþ</a>| <a href="http://www.semtmtw.cn" target="_blank">þþƷĻһ</a>| <a href="http://www.dush.net.cn" target="_blank">޺ݺۺϾþþþ</a>| <a href="http://www.hongyun2000.cn" target="_blank">ƷþùƷ99</a>| <a href="http://www.hyattzhuzhou.cn" target="_blank">ҹƵþþþһ</a>| <a href="http://www.bhxs.net.cn" target="_blank">91Ʒ91Ⱦþþþø </a>| <a href="http://www.0532ks.cn" target="_blank">ƷŮٸaѾþ</a>| <a href="http://www.nbbook.com.cn" target="_blank">ŷ˾þþƷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>