Site updated: 2024-08-08 14:51:39

This commit is contained in:
qinglong committed 2024-08-08 14:51:43 +08:00
1 parent 6166b891bf
commit 46f1245a76
225 files changed
+231 -231

No files matched your search

+3 -3
View File
@@ -110,15 +110,15 @@
<p>本文章介绍的是如何对单表进行分区。</p>
</blockquote>
<h6 id="给表添加分区"><a class="anchor" href="#给表添加分区">#</a> 给表添加分区</h6>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> 表名</span><br><span class="line"><span class="keyword">PARTITION</span> <span class="keyword">BY</span> <span class="keyword">RANGE</span> COLUMNS (时间字段名) (</span><br><span class="line"> <span class="comment">-- 分区条件(时间小于2022-02-01的数据放入p202201分区中)</span></span><br><span class="line"> <span class="keyword">PARTITION</span> p202201 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-02-01'</span>),</span><br><span class="line"> <span class="keyword">PARTITION</span> p202202 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-03-01'</span>),</span><br><span class="line"> <span class="keyword">PARTITION</span> p202203 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-04-01'</span>),</span><br><span class="line"> <span class="comment">-- 继续定义更多的分区...</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure></p>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> 表名(字段)</span><br><span class="line"><span class="keyword">PARTITION</span> <span class="keyword">BY</span> <span class="keyword">RANGE</span> COLUMNS (时间字段名) (</span><br><span class="line"> <span class="comment">-- 分区条件(时间小于2022-02-01的数据放入p202201分区中)</span></span><br><span class="line"> <span class="keyword">PARTITION</span> p202201 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-02-01'</span>),</span><br><span class="line"> <span class="keyword">PARTITION</span> p202202 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-03-01'</span>),</span><br><span class="line"> <span class="keyword">PARTITION</span> p202203 <span class="keyword">VALUES</span> LESS THAN (<span class="string">'2022-04-01'</span>),</span><br><span class="line"> <span class="comment">-- 继续定义更多的分区...</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure></p>
<h6 id="按指定表名创建当前年月的分区"><a class="anchor" href="#按指定表名创建当前年月的分区">#</a> 按指定表名创建当前年月的分区</h6>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> create_monthly_partition(<span class="keyword">IN</span> tableName <span class="type">VARCHAR</span>(<span class="number">255</span>))</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">DECLARE</span> currentYear <span class="type">INT</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> currentMonth <span class="type">INT</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> nextYear <span class="type">INT</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> nextMonth <span class="type">INT</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> partitionName <span class="type">VARCHAR</span>(<span class="number">255</span>);</span><br><span class="line"> <span class="keyword">SET</span> currentYear <span class="operator">=</span> <span class="keyword">YEAR</span>(<span class="built_in">CURRENT_DATE</span>);</span><br><span class="line"> <span class="keyword">SET</span> currentMonth <span class="operator">=</span> <span class="keyword">MONTH</span>(<span class="built_in">CURRENT_DATE</span>);</span><br><span class="line"> <span class="comment">-- 计算下一个月的年份和月份</span></span><br><span class="line"> IF currentMonth <span class="operator">=</span> <span class="number">12</span> <span class="keyword">THEN</span></span><br><span class="line"> <span class="keyword">SET</span> nextYear <span class="operator">=</span> currentYear <span class="operator">+</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">SET</span> nextMonth <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">ELSE</span></span><br><span class="line"> <span class="keyword">SET</span> nextYear <span class="operator">=</span> currentYear;</span><br><span class="line"> <span class="keyword">SET</span> nextMonth <span class="operator">=</span&Line truncated
<h6 id="调用创建新分区"><a class="anchor" href="#调用创建新分区">#</a> 调用创建新分区</h6>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> create_monthly_partition(<span class="string">'表名'</span>);</span><br></pre></td></tr></table></figure></p>
<h6 id="删除指定分区"><a class="anchor" href="#删除指定分区">#</a> 删除指定分区</h6>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> dmpdb.stll_monitdata <span class="keyword">drop</span> <span class="keyword">PARTITION</span> 分区名;</span><br></pre></td></tr></table></figure></p>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> 表名 <span class="keyword">drop</span> <span class="keyword">PARTITION</span> 分区名;</span><br></pre></td></tr></table></figure></p>
<h6 id="每月执行一次调用指定表添加新分区"><a class="anchor" href="#每月执行一次调用指定表添加新分区">#</a> 每月执行一次调用指定表添加新分区</h6>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> EVENT create_monthly_partition_event</span><br><span class="line"><span class="keyword">ON</span> SCHEDULE <span class="keyword">EVERY</span> <span class="number">1</span> <span class="keyword">MONTH</span> </span><br><span class="line">STARTS <span class="string">'2024-01-01 00:00:00'</span></span><br><span class="line">DO</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="comment">-- 定义需要分区的表名列表</span></span><br><span class="line"> <span class="keyword">SET</span> <span class="variable">@tables</span> <span class="operator">=</span> <span class="string">'表名1,表名2'</span>;</span><br><span class="line"> <span class="comment">-- 遍历表名列表并为每个表创建分区</span></span><br><span class="line"> WHILE <span class="keyword">CHAR_LENGTH</span>(<span class="variable">@tables</span>) <span class="operator">></span> <span class="number">0</span> DO</span><br><span class="line"> <span class="keyword">SET</span> <span class="variable">@tableName</span> <span class="operator">=</span> SUBSTRING_INDEX(<span class="variable">@tables</span>, <span class="string">','</span>, <span class="number">1</span>);</span><br><span class="line"> <span class="keyword">SET</span> <span class="variable">@tables</span> <span class="operator">=</span> <span class="built_in">SUBSTRING</span>(<span class="variable">@tables</span>, <span class="keyword">CHAR_LENGTH</span>(<span class="variable">@tableName</span>) <span class="operator">+</span> <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">CALL</span> create_monthly_partition(<span class="variable">@tableName</span>);</span><br><span class="line"> <span class="keyword">END</span> WHILE;</span><br><span class="line"><span class="keyword">END</span></span><br></pre></td></tr></table></figure></p>
<p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> EVENT create_monthly_partition_event</span><br><span class="line"><span class="keyword">ON</span> SCHEDULE <span class="keyword">EVERY</span> <span class="number">1</span> <span class="keyword">MONTH</span></span><br><span class="line">STARTS <span class="string">'2024-01-01 00:00:00.000'</span></span><br><span class="line"><span class="keyword">ON</span> COMPLETION <span class="keyword">NOT</span> PRESERVE</span><br><span class="line">ENABLE</span><br><span class="line">DO <span class="keyword">begin</span></span><br><span class="line"> <span class="keyword">DECLARE</span> CONTINUE HANDLER <span class="keyword">FOR</span> <span class="keyword">SQLEXCEPTION</span></span><br><span class="line"> <span class="keyword">BEGIN</span></span><br><span class="line"> <span class="comment">-- 捕获异常,记录错误信息,然后继续执行</span></span><br><span class="line"> <span class="keyword">SET</span> <span class="variable">@error</span>_message <span class="operator">=</span> CONCAT(<span class="string">'Error occurred while processing table: '</span>, <span class="variable">@tableName</span>);</span><br><span class="line"> <span class="comment">-- 可以将错误信息插入到日志表,或者使用 SELECT 输出错误信息</span></span><br><span class="line"> <span class="keyword">SELECT</span> <span class="variable">@error</span>_message;</span><br><span class="line"> <span class="keyword">END</span>;</span><br><span class="line"> <span class="comment">-- 定义需要分区的表名列表</span></span><br><span class="line">    <span class="keyword">SET</span> <span class="variable">@tables</span> <span class="operator">=</span> <span class="string">'表名1,表名2'</span>;</span><br><span class="line"> <span class="comment">-- 遍历表名列表并为每个表创建分区</span></span><br><span class="line"> WHILE <span class="keyword">CHAR_LENGTH</span>(<span class="variable">@tables</span>) <span class="operator">></span> <span class="number">0</span> DO</span><br><span class="line"> <span class="keyword">SET</span> <span class="variable">@tableName</span> <span class="operator">=</span> SUBSTRING_INDEX(<span class="variable">@tables<Line truncated
</content>
<category term="工作" scheme="https://hitoli.com/categories/%E5%B7%A5%E4%BD%9C/" />
<category term="解决问题" scheme="https://hitoli.com/categories/%E5%B7%A5%E4%BD%9C/%E8%A7%A3%E5%86%B3%E9%97%AE%E9%A2%98/" />