整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Sql自定義函數(shù)去除html標(biāo)簽

          們通常用富文本框編輯內(nèi)容存在數(shù)據(jù)庫中,在做列表顯示數(shù)據(jù)的時候不想顯示原來的樣式,用自定義函數(shù)格式化html標(biāo)簽即可。

          自定義函數(shù)

          alter function [dbo].[dropHtmlTag](@cont varchar(max))

          returns varchar(max)

          as

          begin

          --去掉style標(biāo)簽

          declare @stylecount int;

          set @stylecount = charindex('<style>',@cont);

          while @stylecount>0

          begin

          select @cont=replace(@cont, SUBSTRING(@cont,CHARINDEX('<style>',@cont),CHARINDEX('</style>',@cont)-CHARINDEX('<style>',@cont)+8),'');

          set @stylecount = charindex('<style>',@cont);

          end



          我們執(zhí)行 alter table 語句后,經(jīng)常面臨“跑又跑不完,殺又不敢殺”的窘境。

          如果能評估 alter table 的進(jìn)度就幸福多了。


          實(shí)驗(yàn)

          MySQL官方已經(jīng)給出了文檔:https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-table-performance-schema.html,我們來實(shí)踐一下:

          先建個數(shù)據(jù)庫:

          我們設(shè)置了一些跟 performance_schema 相關(guān)的參數(shù),開啟了查看進(jìn)度必要的功能。

          還是按照之前實(shí)驗(yàn) 11的技巧,快速造一些數(shù)據(jù):

          重復(fù)執(zhí)行 insert,讓表中有足夠數(shù)據(jù):

          我們來跑一個alter table:

          在另一個 session 中,執(zhí)行 SQL 查看進(jìn)度:

          看起來 SQL 比較復(fù)雜,我們先來看看效果:

          這里列出了正在執(zhí)行的 DDL SQL,進(jìn)度評估,當(dāng)前運(yùn)行語句的時間,和估算的剩余時間。

          不斷獲取進(jìn)度:

          可以看到,估算的剩余時間不是完全精確,在整個過程中,進(jìn)度在不停被評估。不過這種精確度對于我們也足夠用了。

          我們來看看評估的主要原理:

          在這張表里,MySQL 提供了如下信息:

          • DDL 語句運(yùn)行的當(dāng)前階段
          • 當(dāng)前階段的開始時間和結(jié)束時間,當(dāng)前階段未結(jié)束時,結(jié)束時間為當(dāng)前時間
          • 父事件 ID,語句運(yùn)行的各個階段,會具有相同的父事件 ID
          • 工作量評估,MySQL 將 DDL 的運(yùn)行過程拆成一個一個任務(wù)包,這里提供了已經(jīng)完成的任務(wù)包數(shù)量和估算的任務(wù)包總數(shù)量,兩者的比值即為當(dāng)前進(jìn)度

          (注意:這里的時間是當(dāng)前階段的時間,而工作量評估是整個語句的工作量)

          這下我們使用的評估 SQL 就不難看懂了:

          附上評估語句的文字版:

          select    stmt.SQL_TEXT as sql_text,    concat(WORK_COMPLETED, '/' , WORK_ESTIMATED) as progress,    (stage.TIMER_END - stmt.TIMER_START) / 1e12 as current_seconds,    (stage.TIMER_END - stmt.TIMER_START) / 1e12 * (WORK_ESTIMATED-WORK_COMPLETED) / WORK_COMPLETED as remaining_seconds    from events_stages_current stage, events_statements_current stmt    where stage.THREAD_ID = stmt.THREAD_ID      and stage.NESTING_EVENT_ID = stmt.EVENT_ID;

          小貼士

          肯定會有同學(xué)問:那開啟 performance_schema 會不會影響性能呢?

          答:在美好的生活面前,不要因噎廢食,多用 1% 的 CPU,不會耗太多電的。


          關(guān)于 MySQL 的技術(shù)內(nèi)容,你們還有什么想知道的嗎?趕緊留言告訴小編吧!

          作為DBA,我們也常常會碰到這樣的需求:需要在不影響線上業(yè)務(wù)的情況下給表添加一個字段或索引。如果是一張只有幾百或幾千條記錄的小表,這樣的需求是非常容易解決的。但如果所管理的表數(shù)據(jù)量已經(jīng)上億、而且應(yīng)用與數(shù)據(jù)庫交互非常頻繁,不允許停機(jī)窗口的出現(xiàn),這樣的需求又該如何滿足?

          大多數(shù)的alter table操作都會涉及l(fā)ock-->copy to new table-->rename-->unlock的過程,鎖表時間會很長,而且alter table 的process不可被kill,一旦執(zhí)行就不可回退。

          在MySQL5.5和之前版本,在運(yùn)行的生產(chǎn)環(huán)境對大表(超過數(shù)百萬紀(jì)錄)執(zhí)行Alter操作是一件很困難的事情。因?yàn)閷⒅亟ū砗玩i表,影響用戶者的使用。

          從MySQL5.6開始,Online DDL特性被引進(jìn)。他增強(qiáng)了很多種類的Alter Table操作避免拷貝表和鎖表,在運(yùn)行Alter操作的同時允許運(yùn)行select,insert,update,delete語句。因此在最新版本,我們可以通過使用ALGORITHM和LOCK選項(xiàng)抑制文件拷貝和加鎖。

          但是即使在MySQL5.6,仍然有一些Alter操作(增加/刪除列,增加/刪除主鍵,改變數(shù)據(jù)類型等)需要重建表。并不建議直接在線上使用alter table。如果線上有DDL的需求我們建議使用以下兩種方式:

          1、主從架構(gòu)輪詢修改

          2、使用在線修改工具online-schema-change

          對于第一種方式,使用的前提是,你的數(shù)據(jù)庫架構(gòu)是一個集群,如果不是,也就無所謂的輪詢修改。修改的原理就是利用主從服務(wù),在應(yīng)用無感知的情況下,得到停機(jī)窗口,進(jìn)行修改。今天我們著重講第二種方式,利用第三方工具實(shí)現(xiàn)在線大表的DDL操作。這種方式在alter操作更改表結(jié)構(gòu)的時候不用鎖定表,也就是說執(zhí)行alter的時候不會阻塞寫和讀取操作。

          參考官網(wǎng):https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html


          1、用法

          pt-online-schema-change [OPTIONS] DSN
          

          pt-online-schema-change alters a table’s structure without blocking reads or writes. Specify the database and table in the DSN. Do not use this tool before reading its documentation and checking your backups carefully.


          2、參數(shù)

          pt-online-schema-change --help 可以查看參數(shù)的使用,如果只是要修改個表結(jié)構(gòu),只需要知道幾個簡單的參數(shù)就可以了

          • --user= 連接mysql的用戶名
          • --password= 連接mysql的密碼
          • --host= 連接mysql的地址
          • P=3306 連接mysql的端口號
          • D= 連接mysql的庫名
          • t= 連接mysql的表名
          • --alter 修改表結(jié)構(gòu)的語句
          • --execute 執(zhí)行修改表結(jié)構(gòu)
          • --charset=utf8 使用utf8編碼,避免中文亂碼
          • --no-version-check 不檢查版本,在阿里云服務(wù)器中一般加入此參數(shù),否則會報錯

          截圖如下:


          3、腳本復(fù)用

          為避免每次都要輸入一堆參數(shù),寫個腳本復(fù)用一下。

          #!/bin/bash
          #copyright by hwb 
          table=$1
          alter_conment=$2
          cnn_host='172.16.xx'
          cnn_user='root'
          cnn_pwd='xxxx'
          cnn_db='lcpdb'
          echo "$table"
          echo "$alter_conment"
          pt-online-schema-change --charset=utf8 --no-version-check --user=${cnn_user} --password=${cnn_pwd} --host=${cnn_host} P=3306,D=${cnn_db},t=$table --alter "${alter_conment}" --execute --no-check-alter
          

          下面用例子來說明下。


          4、添加表字段

          如添加表字段SQL語句為:

          ALTER TABLE tb_test ADD COLUMN column1 tinyint(4) DEFAULT NULL;
          

          那么使用pt-online-schema-change則可以這樣寫

          sh pt_epms.sh tb_test "ADD COLUMN column1 tinyint(4) DEFAULT NULL"
          

          執(zhí)行如下:

          查看表結(jié)構(gòu)已經(jīng)修改完成:


          5、修改表字段

          SQL語句:

          ALTER TABLE tb_test MODIFY COLUMN id int(11) unsigned NOT NULL DEFAULT '0';
          

          pt-online-schema-change工具:

          sh pt_epms.sh tb_test "MODIFY COLUMN id int(11) unsigned NOT NULL DEFAULT '0'"
          

          執(zhí)行如下:

          查看表結(jié)構(gòu):


          6、修改表字段名

          SQL語句:

          ALTER TABLE tb_test CHANGE COLUMN name adress varchar(30);
          

          pt-online-schema-change工具:

          sh pt_epms.sh tb_test "CHANGE COLUMN name address varchar(30)"
          


          7、添加索引

          SQL語句:

          ALTER TABLE tb_test ADD INDEX idx_address(address);
          

          pt-online-schema-change工具:

          sh pt_epms.sh tb_test "ADD INDEX idx_address(address)"
          


          總結(jié)

          pt-online-schema-change工具還有很多其他的參數(shù),可以有很多限制,比如限制CPU、線程數(shù)量、從庫狀態(tài)等等,不過我做過一個超過1000W表的結(jié)構(gòu)修改,發(fā)現(xiàn)幾乎不影響性能,很穩(wěn)定很流暢的就修改了表結(jié)構(gòu),所以,對以上常規(guī)參數(shù)的使用基本能滿足業(yè)務(wù)。

          注意一定要在業(yè)務(wù)低峰期做,這樣才能確保萬無一失。

          后面會分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~


          主站蜘蛛池模板: 久久青青草原一区二区| 精品亚洲一区二区三区在线播放| 国产精品亚洲一区二区三区久久| 午夜视频久久久久一区| 日韩毛片基地一区二区三区| 国产一区二区成人| 另类ts人妖一区二区三区| 高清一区二区三区| 亚洲国产福利精品一区二区| 日韩成人无码一区二区三区| 精品乱人伦一区二区| 射精专区一区二区朝鲜| 一区二区视频在线免费观看| 亚洲AV乱码一区二区三区林ゆな | 国产波霸爆乳一区二区 | 蜜桃无码一区二区三区| 国产精品日韩一区二区三区 | 3d动漫精品啪啪一区二区中文| 无码夜色一区二区三区| 久久99国产精品一区二区| 色天使亚洲综合一区二区| 久久久久人妻一区精品色| 成人影片一区免费观看| 性色av无码免费一区二区三区 | www一区二区www免费| 久久久精品人妻一区二区三区蜜桃| 精品一区二区三区四区| 国产伦精品一区二区三区视频金莲 | 精品人妻少妇一区二区| 一区二区三区四区视频| 一区精品麻豆入口| jazzjazz国产精品一区二区| 国产一区精品视频| 国产伦精品一区二区三区免费迷| 精品国产一区二区三区香蕉事| 夜夜爽一区二区三区精品| 麻豆视频一区二区三区| 国产精品区AV一区二区| 国产美女露脸口爆吞精一区二区| 国产精品一区二区综合| 日韩欧美一区二区三区免费观看|