主頁 > 資料庫 > MySQL 中如何歸檔資料

MySQL 中如何歸檔資料

2022-03-14 07:14:14 資料庫

歸檔,在 MySQL 中,是一個相對高頻的操作,

它通常涉及以下兩個動作:

  1. 遷移,將資料從業務實體遷移到歸檔實體,
  2. 洗掉,從業務實體中洗掉已遷移的資料,

在處理類似需求時,都是開發童鞋提單給 DBA,由 DBA 來處理,

于是,很多開發童鞋就好奇,DBA 都是怎么執行歸檔操作的?歸檔條件沒有索引會鎖表嗎?安全嗎,會不會資料刪了,卻又沒歸檔成功?

針對這些疑問,下面介紹 MySQL 中的資料歸檔神器 - pt-archiver,

本文主要包括以下幾部分:

  1. 什么是 pt-archiver
  2. 安裝
  3. 簡單入門
  4. 實作原理
  5. 批量歸檔
  6. 不同歸檔引數之間的速度對比
  7. 常見用法
  8. 如何避免主從延遲
  9. 常用引數

 

什么是 pt-archiver

pt-archiver 是 Percona Toolkit 中的一個工具,

Percona Toolkit 是 Percona 公司提供的一個 MySQL 工具包,工具包里提供了很多實用的 MySQL 管理工具,

譬如,我們常用的表結構變更工具 pt-online-schema-change ,主從資料一致性校驗工具 pt-table-checksum ,

毫不夸張地說,熟練使用 Percona Toolkit 是 MySQL DBA 必備的技能之一,

 

安裝

Percona Toolkit 下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

圖片

官方針對多個系統提供了現成的軟體包,

我常用的是 Linux - Generic 二進制包,

下面以 Linux - Generic 版本為例,看看它的安裝方法,

# cd /usr/local/
# wget https://downloads.percona.com/downloads/percona-toolkit/3.3.1/binary/tarball/percona-toolkit-3.3.1_x86_64.tar.gz --no-check-certificate
# tar xvf percona-toolkit-3.3.1_x86_64.tar.gz
# cd percona-toolkit-3.3.1
# yum install perl-ExtUtils-MakeMaker perl-DBD-MySQL perl-Digest-MD5
# perl Makefile.PL
# make
# make install

 

簡單入門

首先,我們看一個簡單的歸檔 Demo,

測驗資料

mysql> show create table employees.departments\G
*************************** 1. row ***************************
       Table: departments
Create Table: CREATE TABLE `departments` (
  `dept_no` char(4) NOT NULL,
  `dept_name` varchar(40) NOT NULL,
  PRIMARY KEY (`dept_no`),
  UNIQUE KEY `dept_name` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> select * from employees.departments;
+---------+--------------------+
| dept_no | dept_name          |
+---------+--------------------+
| d009    | Customer Service   |
| d005    | Development        |
| d002    | Finance            |
| d003    | Human Resources    |
| d001    | Marketing          |
| d004    | Production         |
| d006    | Quality Management |
| d008    | Research           |
| d007    | Sales              |
+---------+--------------------+
9 rows in set (0.00 sec)

 下面,我們將 employees.departments 表的資料從 192.168.244.10 歸檔到 192.168.244.128,

具體命令如下:

pt-archiver --source h=192.168.244.10,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --dest h=192.168.244.128,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --where "1=1"

命令列中指定了三個引數,

  • --source:源庫(業務實體)的 DSN,

    DSN 在 Percona Toolkit 中比較常見,可理解為目標實體相關資訊的縮寫,

    支持的縮寫及含義如下:

    縮寫  含義
    ===  =============================================
    A    默認的字符集
    D    庫名
    F    只從給定檔案中讀取配置資訊,類似于MySQL中的--defaults-file
    P    埠
    S    用于連接的socket檔案
    h    主機名
    p    密碼
    t    表名
    u    用戶名
  • --dest:目標庫(歸檔實體)的 DSN,

  • --where:歸檔條件,"1=1"代表歸檔全表,

 

實作原理

下面結合 General log 的輸出看看 pt-archiver 的實作原理,

源庫日志

2022-03-06T10:58:20.612857+08:00       10 Query SELECT /*!40001 SQL_NO_CACHE */ `dept_no`,`dept_name` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) ORDER BY `dept_no` LIMIT 1

2022-03-06T10:58:20.613451+08:00       10 Query DELETE FROM `employees`.`departments` WHERE (`dept_no` = 'd001')
2022-03-06T10:58:20.620327+08:00       10 Query commit

2022-03-06T10:58:20.628409+08:00       10 Query SELECT /*!40001 SQL_NO_CACHE */ `dept_no`,`dept_name` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) AND ((`dept_no` >= 'd001')) ORDER BY `dept_no` LIMIT 1

2022-03-06T10:58:20.629279+08:00       10 Query DELETE FROM `employees`.`departments` WHERE (`dept_no` = 'd002')
2022-03-06T10:58:20.636154+08:00       10 Query commit
...

目標庫日志

2022-03-06T10:58:20.613144+08:00       18 Query INSERT INTO `employees`.`departments`(`dept_no`,`dept_name`) VALUES ('d001','Marketing')
2022-03-06T10:58:20.613813+08:00       18 Query commit

2022-03-06T10:58:20.628843+08:00       18 Query INSERT INTO `employees`.`departments`(`dept_no`,`dept_name`) VALUES ('d002','Finance')
2022-03-06T10:58:20.629784+08:00       18 Query commit
...

結合源庫和目標庫的日志,可以看到,

  1. pt-archiver 首先會從源庫查詢一條記錄,然后再將該記錄插入到目標庫中,

    目標庫插入成功,才會從源庫中洗掉這條記錄,

    這樣就能確保資料在洗掉之前,一定是歸檔成功的,

  2. 仔細觀察這幾個操作的執行時間,其先后順序如下,

    (1)源庫查詢記錄,

    (2)目標庫插入記錄,

    (3)源庫洗掉記錄,

    (4)目標庫 COMMIT,

    (5)源庫 COMMIT,

    這種實作借鑒了分布式事務中的兩階段提交演算法,

  3. --where 引數中的 "1=1" 會傳遞到 SELECT 操作中,

    "1=1" 代表歸檔全表,也可指定其它條件,如我們常用的時間,

  4. 每次查詢都是使用主鍵索引,這樣即使歸檔條件中沒有索引,也不會產生全表掃描,

  5. 每次洗掉都是基于主鍵,這樣可避免歸檔條件沒有索引導致全表被鎖的風險,

 

批量歸檔

如果使用 Demo 中的引數進行歸檔,在資料量比較大的情況下,效率會非常低,畢竟 COMMIT 是一個昂貴的操作,

所以在線上,我們通常都會進行批量操作,

具體命令如下:

pt-archiver --source h=192.168.244.10,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --dest h=192.168.244.128,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --where "1=1" --bulk-delete --limit 1000 --commit-each --bulk-insert 

相對于之前的歸檔命令,這條命令額外指定了四個引數,其中,

  • --bulk-delete:批量洗掉,

  • --limit:每批歸檔的記錄數,

  • --commit-each:對于每一批記錄,只會 COMMIT 一次,

  • --bulk-insert:歸檔資料以 LOAD DATA INFILE 的方式匯入到歸檔庫中,

看看上述命令對應的 General log ,

源庫

2022-03-06T12:13:56.117984+08:00       53 Query SELECT /*!40001 SQL_NO_CACHE */ `dept_no`,`dept_name` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) ORDER BY `dept_no` LIMIT 1000
...
2022-03-06T12:13:56.125129+08:00       53 Query DELETE FROM `employees`.`departments` WHERE (((`dept_no` >= 'd001'))) AND (((`dept_no` <= 'd009'))) AND (1=1) LIMIT 1000
2022-03-06T12:13:56.130055+08:00       53 Query commit

目標庫

2022-03-06T12:13:56.124596+08:00    51 Query LOAD DATA LOCAL INFILE '/tmp/hitKctpQTipt-archiver' INTO TABLE `employees`.`departments`(`dept_no`,`dept_name`)
2022-03-06T12:13:56.125616+08:00    51 Query commit:

注意:

  1. 如果要執行 LOAD DATA LOCAL INFILE 操作,需將目標庫的 local_infile 引數設定為 ON,

  2. 如果不指定 --bulk-insert 且沒指定 --commit-each,則目標庫的插入還是會像 Demo 中顯示的那樣,逐行提交,

  3. 如果不指定 --commit-each,即使表中的 9 條記錄是通過一條 DELETE 命令洗掉的,但因為涉及了 9 條記錄,pt-archiver 會執行 COMMIT 操作 9 次,目標庫同樣如此,

  4. 在使用 --bulk-insert 歸檔時要注意,如果匯入的程序中出現問題,譬如主鍵沖突,pt-archiver 是不會提示任何錯誤的,

 

不同歸檔引數之間的速度對比

下表是歸檔 20w 資料,不同引數之間的執行時間對比,

歸檔引數執行時間(s)
不指定任何批量相關引數 850.040
--bulk-delete --limit 1000 422.352
--bulk-delete --limit 1000 --commit-each 46.646
--bulk-delete --limit 5000 --commit-each 46.111
--bulk-delete --limit 1000 --commit-each --bulk-insert 7.650
--bulk-delete --limit 5000 --commit-each --bulk-insert 6.540
--bulk-delete --limit 1000 --bulk-insert 47.273

通過表格中的資料,我們可以得出以下幾點:

  1. 第一種方式是最慢的,

    這種情況下,無論是源庫還是歸檔庫,都是逐行操作并提交的,

  2. 只指定 --bulk-delete --limit 1000 依然很慢,

    這種情況下,源庫是批量洗掉,但 COMMIT 次數并沒有減少,

    歸檔庫依然是逐行插入并提交的,

  3. --bulk-delete --limit 1000 --commit-each

    相當于第二種歸檔方式,源庫和目標庫都是批量提交的,

  4. --limit 1000 和 --limit 5000 歸檔性能相差不大,

  5. --bulk-delete --limit 1000 --bulk-insert 與 --bulk-delete --limit 1000 --commit-each --bulk-insert 相比,沒有設定 --commit-each,

    雖然都是批量操作,但前者會執行 COMMIT 操作 1000 次,

    由此來看,空事務并不是沒有代價的,

 

其它常見用法

(1)洗掉資料

洗掉資料是 pt-archiver 另外一個常見的使用場景,

具體命令如下:

pt-archiver --source h=192.168.244.10,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --where "1=1" --bulk-delete --limit 1000 --commit-each --purge --primary-key-only

命令列中的 --purge 代表只洗掉,不歸檔,

指定了 --primary-key-only ,這樣,在執行 SELECT 操作時,就只會查詢主鍵,不會查詢所有列,

接下來,我們看看洗掉命令相關的 General log ,

為了直觀地展示 pt-archiver 洗掉資料的實作邏輯,實際測驗時將 --limit 設定為了 3,

# 開啟事務
set autocommit=0;

# 查看表結構,獲取主鍵
SHOW CREATE TABLE `employees`.`departments`;

# 開始洗掉第一批資料
# 通過 FORCE INDEX(`PRIMARY`) 強制使用主鍵
# 指定了 --primary-key-only,所以只會查詢主鍵
# 這里其實無需獲取所有滿足條件的主鍵值,只取一個最小值和最大值即可,
SELECT /*!40001 SQL_NO_CACHE */ `dept_no` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) ORDER BY `dept_no` LIMIT 3;

# 基于主鍵進行洗掉,洗掉的時候同時帶上了 --where 指定的洗掉條件,以避免誤刪
DELETE FROM `employees`.`departments` WHERE (((`dept_no` >= 'd001'))) AND (((`dept_no` <= 'd003'))) AND (1=1) LIMIT 3;

# 提交
commit;

# 洗掉第二批資料
SELECT /*!40001 SQL_NO_CACHE */ `dept_no` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) AND ((`dept_no` >= 'd003')) ORDER BY `dept_no` LIMIT 3;
DELETE FROM `employees`.`departments` WHERE (((`dept_no` >= 'd004'))) AND (((`dept_no` <= 'd006'))) AND (1=1); LIMIT 3
commit;


# 洗掉第三批資料
SELECT /*!40001 SQL_NO_CACHE */ `dept_no` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) AND ((`dept_no` >= 'd006')) ORDER BY `dept_no` LIMIT 3;
DELETE FROM `employees`.`departments` WHERE (((`dept_no` >= 'd007'))) AND (((`dept_no` <= 'd009'))) AND (1=1) LIMIT 3;
commit;

# 洗掉最后一批資料
SELECT /*!40001 SQL_NO_CACHE */ `dept_no` FROM `employees`.`departments` FORCE INDEX(`PRIMARY`) WHERE (1=1) AND ((`dept_no` >= 'd009')) ORDER BY `dept_no` LIMIT 3;
commit;

在業務代碼中,如果我們有類似的洗掉需求,不妨借鑒下 pt-archiver 的實作方式,

(2)將資料歸檔到檔案中

資料除了能歸檔到資料庫,也可歸檔到檔案中,

具體命令如下:

pt-archiver --source h=192.168.244.10,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --where "1=1" --bulk-delete --limit 1000 --file '/tmp/%Y-%m-%d-%D.%t'

指定的是 --file ,而不是 --dest,

檔案名使用了日期格式化符號,支持的符號及含義如下:

%d    Day of the month, numeric (01..31)
%H    Hour (00..23)
%i    Minutes, numeric (00..59)
%m    Month, numeric (01..12)
%s    Seconds (00..59)
%Y    Year, numeric, four digits
%D    Database name
%t    Table name

生成的檔案是 CSV 格式,后續可通過 LOAD DATA INFILE 命令加載到資料庫中,

 

如何避免主從延遲

無論是資料歸檔還是洗掉,對于源庫,都需要執行 DELETE 操作,

很多人擔心,如果洗掉的記錄數太多,會造成主從延遲,

事實上,pt-archiver 本身就具備了基于主從延遲來自動調節歸檔(洗掉)操作的能力,

如果從庫的延遲超過 1s(由 --max-lag 指定)或復制狀態不正常,則會暫停歸檔(洗掉)操作,直到從庫恢復,

默認情況下,pt-archiver 不會檢查從庫的延遲情況,

如果要檢查,需通過 --check-slave-lag 顯式設定從庫的地址,譬如,

pt-archiver --source h=192.168.244.10,P=3306,u=pt_user,p=pt_pass,D=employees,t=departments --where "1=1" --bulk-delete --limit 1000 --commit-each --primary-key-only --purge --check-slave-lag h=192.168.244.20,P=3306,u=pt_user,p=pt_pass

這里只會檢查 192.168.244.20 的延遲情況,

如果有多個從庫需要檢查,需將 --check-slave-lag 指定多次,每次對應一個從庫,

 

常用引數

--analyze

在執行完歸檔操作后,執行 ANALYZE TABLE 操作,

后面可接任意字串,如果字串中含有 s ,則會在源庫執行 ANALYZE 操作,

如果字串中含有 d ,則會在目標庫執行 ANALYZE 操作,

如果同時帶有 d 和 s ,則源庫和目標庫都會執行 ANALYZE 操作,如,

--analyze ds

--optimize

在執行完歸檔操作后,執行 OPTIMIZE TABLE 操作,

用法同 --analyze 類似,

 

--charset

指定連接(Connection)字符集,

在 MySQL 8.0 之前,默認是 latin1,

在 MySQL 8.0 中,默認是 utf8mb4 ,

注意,這里的默認值與 MySQL 服務端字符集 character_set_server 無關,

若顯式設定了該值,pt-archiver 在建立連接后,會首先執行 SET NAMES 'charset_name' 操作,

 

--[no]check-charset

檢查源庫(目標庫)連接(Connection)字符集和表的字符集是否一致,

如果不一致,會提示以下錯誤:

Character set mismatch: --source DSN uses latin1, table uses gbk.  You can disable this check by specifying --no-check-charset.

這個時候,切記不要按照提示指定  --no-check-charset 忽略檢查,否則很容易導致亂碼,

針對上述報錯,可將 --charset 指定為表的字符集,

注意,該選項并不是比較源庫和目標庫的字符集是否一致,

 

--[no]check-columns

檢查源表和目標表列名是否一致,

注意,只會檢查列名,不會檢查列的順序、列的資料型別是否一致,

 

--columns

歸檔指定列,

在有自增列的情況下,如果源表和目標表的自增列存在交集,可不歸檔自增列,這個時候,就需要使用 --columns 顯式指定歸檔列,

 

--dry-run

只列印待執行的 SQL,不實際執行,

常用于實際操作之前,校驗待執行的 SQL 是否符合自己的預期,

 

--ignore

使用 INSERT IGNORE 歸檔資料,

 

--no-delete

不洗掉源庫的資料,

 

--replace

使用 REPLACE 操作歸檔資料,

 

--[no]safe-auto-increment

在歸檔有自增主鍵的表時,默認不會洗掉自增主鍵最大的那一行,

這樣做,主要是為了規避 MySQL 8.0 之前自增主鍵不能持久化的問題,

在對全表進行歸檔時,這一點需要注意,

如果需要洗掉,需指定 --no-safe-auto-increment ,

 

--source

給出源端實體的資訊,

除了常用的選項,其還支持如下選項:

  • a:指定連接的默認資料庫,

  • b:設定 SQL_LOG_BIN=0 ,

    如果是在源庫指定,則 DELETE 操作不會寫入到 Binlog 中,

    如果是在目標庫指定,則 INSERT 操作不會寫入到 Binlog 中,

  • i:設定歸檔操作使用的索引,默認是主鍵,

 

--progress

顯示進度資訊,單位行數,

如 --progress 10000,則每歸檔(洗掉)10000 行,就列印一次進度資訊,

TIME                ELAPSED   COUNT
2022-03-06T18:24:19       0       0
2022-03-06T18:24:20       0   10000
2022-03-06T18:24:21       1   20000

第一列是當前時間,第二列是已經消耗的時間,第三列是已歸檔(洗掉)的行數,

 

總結

前面,我們對比了歸檔操作中不同引數的執行時間,

其中,--bulk-delete --limit 1000 --commit-each --bulk-insert 是最快的,不指定任何批量操作引數是最慢的,

但在使用 --bulk-insert 時要注意 ,如果匯入的程序中出現問題,pt-archiver 是不會提示任何錯誤的,

常見的錯誤有主鍵沖突,資料和目標列的資料型別不一致,

如果不使用 --bulk-insert,而是通過默認的 INSERT 操作來歸檔,大部分錯誤是可以識別出來的,

譬如,主鍵沖突,會提示以下錯誤,

DBD::mysql::st execute failed: Duplicate entry 'd001' for key 'PRIMARY' [for Statement "INSERT INTO `employees`.`departments`(`dept_no`,`dept_name`) VALUES (?,?)" with ParamValues: 0='d001', 1='Marketing'] at /usr/local/bin/pt-archiver line 6772.

匯入的資料和目標列的資料型別不一致,會提示以下錯誤,

DBD::mysql::st execute failed: Incorrect integer value: 'Marketing' for column 'dept_name' at row 1 [for Statement "INSERT INTO `employees`.`departments`(`dept_no`,`dept_name`) VALUES (?,?)" with ParamValues: 0='d001', 1='Marketing'] at /usr/local/bin/pt-archiver line 6772.

當然,資料和型別不一致,能被識別出來的前提是歸檔實體的 SQL_MODE 為嚴格模式,

如果待歸檔的實體中有 MySQL 5.6 ,我們其實很難將歸檔實體的 SQL_MODE 開啟為嚴格模式,

因為 MySQL 5.6 的 SQL_MODE 默認為非嚴格模式,所以難免會產生很多無效資料,譬如時間欄位中的 0000-00-00 00:00:00 ,

這種無效資料,如果插入到開啟了嚴格模式的歸檔實體中,會直接報錯,

從資料安全的角度出發,最推薦的歸檔方式是:

  1. 先歸檔,但不洗掉源庫的資料,
  2. 比對源庫和歸檔庫的資料是否一致,
  3. 如果比對結果一致,再洗掉源庫的歸檔資料,

其中,第一步和第三步可通過 pt-archiver 搞定,第二步可通過 pt-table-sync 搞定,

相對于邊歸檔邊洗掉的這種方式,雖然麻煩不少,但相對來說,更安全,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442870.html

標籤:其他

上一篇:MySQL 中如何歸檔資料

下一篇:我的ID密鑰不會“重新啟動”,并且始終只會在POST請求期間在資料庫中增加

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more