Percona-Toolkit 之 pt-archiver 總結

来源:https://www.cnblogs.com/dbabd/archive/2019/04/17/10721857.html
-Advertisement-
Play Games

pt archiver Archive rows from a MySQL table into another table or a file. pt archiver nibbles records from a MySQL table. The and arguments use DSN sy ...


pt-archiver - Archive rows from a MySQL table into another table or a file.

pt-archiver nibbles records from a MySQL table. The --source and --dest arguments use DSN syntax; if COPY is yes, --dest defaults to the key's value from --source.

pt-archiver是Percona-Toolkit工具集中的一個組件,是一個主要用於對MySQL表數據進行歸檔和清除工具。它可以將數據歸檔到另一張表或者是一個文件中。pt-archiver在清除表數據的過程中並不會影響OLTP事務的查詢性能。對於數據的歸檔,它可以歸檔到另一臺伺服器上的另一張表,也可歸檔到一個文件中,文件可以用LOAD DATA INFILE進行數據裝載,這個功能其實就類似是表歷史數據的增量刪除。

本文是關於之前有關pt-archiver工具使用的學習筆記進行重新整理,使用最新版本的工具同時也進行原理知識的梳理。

關於獲取和安裝Percona-Toolkit工具集可以參考我另一篇博文:Percona-Toolkit 之 pt-online-schema-change 總結中的安裝部分。

基本說明

pt-archiver [OPTIONS] --source DSN --where WHERE

常用選項(OPTIONS)

--analyze
指定工具完成數據歸檔後對錶執行'ANALYZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。

--ask-pass
命令行提示密碼輸入,保護密碼安全,前提需安裝模塊perl-TermReadKey。

--buffer
指定緩衝區數據刷新到選項'--file'指定的文件並且在提交時刷新。
只有當事務提交時禁用自動刷新到'--file'指定的文件和刷新文件到磁碟,這意味著文件是被操作系統塊進行刷新,因此在事務進行提交之前有一些數據隱式刷新到磁碟。預設是每一行操作後進行文件刷新到磁碟。

--bulk-delete
指定單個語句刪除chunk的方式來批量刪除行,會隱式執行選項'--commit-each'。
使用單個DELETE語句刪除每個chunk對應的表行,通常的做法是通過主鍵進行逐行的刪除,批量刪除在速度上會有很大的提升,但如果有複雜的'WHERE'條件就可能會更慢。

--[no]bulk-delete-limit
預設值:yes
指定添加選項'--bulk-delete'和'--limit'到進行歸檔的語句中。

--bulk-insert
使用LOAD DATA LOCAL INFILE的方法,通過批量插入chunk的方式來插入行(隱式指定選項'--bulk-delete'和'--commit-each')
而不是通過逐行單獨插入的方式進行,它比單行執行INSERT語句插入的速度要快。通過隱式創建臨時表來存儲需要批量插入的行(chunk),而不是直接進行批量插入操作,當臨時表中完成每個chunk之後再進行統一數據載入。為了保證數據的安全性,該選項會強制使用選項'--bulk-delete',這樣能夠有效保證刪除是在插入完全成功之後進行的。

--channel
指定當主從複製環境是多源複製時需要進行歸檔哪個主庫的數據,適用於多源複製中多個主庫對應一個從庫的情形。

--charset,-A
指定連接字元集。

--[no]check-charset
預設值:yes
指定檢查確保資料庫連接時字元集和表字元集相同。

--[no]check-columns
預設值:yes
指定檢查確保選項'--source'指定的源端表和'--dest'指定的目標表具有相同的欄位。
不檢查欄位在表的排序和欄位類型,只檢查欄位是否在源端表和目標表當中都存在,如果有不相同的欄位差異,則工具報錯退出。如果需要禁用該檢查,則指定'--no-check-columns'。

--check-slave-lag
指定主從複製延遲大於選項'--max-lag'指定的值之後暫停歸檔操作。預設情況下,工具會檢查所有的從庫,但該選項只作用於指定的從庫(通過DSN連接方式)。

--check-interval
預設值:1s
如果同時指定了選項'--check-slave-lag',則該選項指定的時間為工具發現主從複製延遲時暫停的時間。每進行操作100行時進行一次檢查。

--columns,-c
指定需要歸檔的表欄位,如有多個則用','(逗號)隔開。

--commit-each
指定按每次獲取和歸檔的行數進行提交,該選項會禁用選項'--txn-size'。
在每次獲取表數據併進行歸檔之後,在獲取下一次數據和選項'--sleep'指定的休眠時間之前,進行事務提交和刷新選項'--file'指定的文件,通過選項'--limit'控制事務的大小。

--host,-h
指定連接的資料庫IP地址。

--port,-P
指定連接的資料庫Port埠。

--user,-u
指定連接的資料庫用戶。

--password,-p
指定連接的資料庫用戶密碼。

--socket,-S
指定使用SOCKET文件連接。

--databases,-d
指定連接的資料庫

--source
指定需要進行歸檔操作的表,該選項是必須指定的選項,使用DSN方式表示。

--dest
指定要歸檔到的目標端表,使用DSN方式表示。
如果該選項沒有指定的話,則預設與選項'--source'指定源端表為相同表。

--where
指定通過WHERE條件語句指定需要歸檔的數據,該選項是必須指定的選項。不需要加上'WHERE'關鍵字,如果確實不需要WHERE條件進行限制,則指定'--where 1=1'。

--file
指定表數據需要歸檔到的文件。使用類似MySQL DATE_FORMAT()格式化命名方式。
文件內容與MySQL中SELECT INTO OUTFILE語句使用相同的格式,文件命名選項如下所示:
'
%Y:年,4位數(Year, numeric, four digits)        
%m:月,2位數(Month, numeric (01..12))       
%d:日,2位數(Day of the month, numeric (01..31))    
%H:小時(Hour (00..23))                
%i:分鐘(Minutes, numeric (00..59))            
%s:秒(Seconds (00..59))             
%D:資料庫名(Database name)            
%t:表名(Table name)                   

例如:--file '/var/log/archive/%Y-%m-%d-%D.%t'
'

--output-format
指定選項'--file'文件內容輸出的格式。
預設不指定該選項是以製表符進行欄位的分隔符,如果指定該選項,則使用','(逗號)作為欄位分隔符,使用'"'(雙引號)將欄位括起。用法示例:'--output-format=dump'。

--for-update
指定為每次歸檔執行的SELECT語句添加FOR UPDATE子句。

--share-lock
指定為每次歸檔執行的SELECT語句添加LOCK IN SHARE MODE子句。

--header
指定在文件中第一行寫入欄位名稱作為標題。

--ignore
指定為INSERT語句添加IGNORE選項。

--limit
預設值:1
指定每條語句獲取表和歸檔表的行數。

--local
指定不將OPTIMIZE和ANALYZE語句寫入binlog。

--max-lag
預設值:1s
指定允許主從複製延遲時長的最大值,單位秒。如果在每次獲取行數據之後主從延遲超過指定的值,則歸檔操作將暫停執行,暫停休眠時間為選項'--check-interval'指定的值。待休眠時間結束之後再次檢查主從延遲時長,檢查方法是通過從庫查詢的'Seconds_Behind_Master'值來確定。如果主從複製延遲一直大於該參數指定值或者從庫停止複製,則操作將一直等待直到從庫重新啟動並且延遲小於該參數指定值。

--no-delete
指定不刪除已被歸檔的表數據。

--optimize
指定工具完成數據歸檔後對錶執行'OPTIMIZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。

--primary-key-only
指定只歸檔主鍵欄位,是選項'--columns=主鍵'的簡寫。
如果工具歸檔的操作是進行DELETE清除時最有效,因為只需讀取主鍵一個欄位而無需讀取行所有欄位。

--progress
指定每多少行列印進度信息,列印當前時間,已用時間以及多少行進行歸檔。

--purge
指定執行的清除操作而不是歸檔操作。允許忽略選項'--dest'和'--file'進行操作,如果只是清除操作可以結合選項'--primary-key-only'會更高效。

--quiet,-q
指定工具靜默執行,不輸出任何的執行信息。

--replace
指定寫入選項'--dest'指定目標端表時改寫INSERT語句為REPLACE語句。

--retries
預設值:1
指定歸檔操作遇到死鎖或超時的重試次數。當重試次數超過該選項指定的值時,工具將報錯退出。

--run-time
指定工具歸檔操作在退出之前需要運行的時間。允許的時間尾碼名為s=秒,m=分,h=小時,d=天,如果沒指定,預設為s。

--[no]safe-auto-increment
預設值:yes
指定不使用自增列(AUTO_INCREMENT)最大值對應的行進行歸檔。
該選項在進行歸檔清除時會額外添加一條WHERE子句以防止工具刪除單列升序欄位具有的具有AUTO_INCREMENT屬性最大值的數據行,為了在資料庫重啟之後還能使用到AUTO_INCREMENT對應的值,但這會引起無法歸檔或清除欄位對應最大值的行。

--set-vars
預設:
    wait_timeout=10000
    innodb_lock_wait_timeout=1
    lock_wait_timeout=60
工具歸檔時指定參數值,如有多個用','(逗號)分隔。如'--set-vars=wait_timeout=5000'。

--skip-foreign-key-checks
指定使用語句SET FOREIGN_KEY_CHECKS = 0禁用外鍵檢查。

--sleep
指定工具在通過SELECT語句獲取歸檔數據需要休眠的時間,預設值是不進行休眠。在休眠之前事務並不會提交,並且選項'--file'指定的文件不會被刷新。如果指定選項'--commit-each',則在休眠之前會進行事務提交和文件刷新。

--statistics
指定工具收集並列印操作的時間統計信息。
統計信息示例如下:
'
Started at 2008-07-18T07:18:53, ended at 2008-07-18T07:18:53
Source: D=db,t=table
SELECT 4
INSERT 4
DELETE 4
Action         Count       Time        Pct
commit            10     0.1079      88.27
select             5     0.0047       3.87
deleting           4     0.0028       2.29
inserting          4     0.0028       2.28
other              0     0.0040       3.29
'

--txn-size
預設:1
指定每個事務處理的行數。如果是0則禁用事務功能。

--version
顯示工具的版本並退出。

--[no]version-check
預設值:yes
檢查Percona Toolkit、MySQL和其他程式的最新版本。

--why-quit
指定工具列印當非因完成歸檔行數退出的原因。
在執行一個自動歸檔任務時該選項與選項'--run-time'一起使用非常方便,這樣可以確定歸檔任務是否在指定的時間內完成。如果同時指定了選項'--statistics',則會列印所有退出的原因。

DSN選項(DSN)

可以使用DSN方式來連接資料庫,DSN選項為key=value方式,在等號的兩側不能有空格出現,並且區分大小寫,多個選項之前以','(逗號)隔開,主要選項如下:

  • a
    歸檔操作是在哪個庫下進行的,相當於USE操作。
  • A
    指定預設字元集。
  • b
    當值為true時,禁止SQL_LOG_BIN,相當於SQL_LOG_BIN = 0
  • D
    指定包含需要歸檔表的資料庫。
  • h
    指定連接的主機。
  • u
    指定連接的用戶。
  • p
    指定連接需要的密碼。
  • P
    指定連接的埠。
  • S
    指定連接的SOCKET文件。
  • t
    指定需要歸檔的表。
  • i
    指定需要使用的索引。

選項用法說明

  1. 工具至少需指定選項--dest--file--purge其中之一;
  2. 選項--ignore--replace是互斥的;
  3. 選項--txn-size--commit-each是互斥的;
  4. 選項--share-lock--for-update是互斥的;
  5. --analyze--optimize是互斥的。

用法示例

環境與數據準備

MySQL:5.7.24 192.168.58.3:3306
Percona Server:192.168.58.3:3308

本文基於MySQL官方示例資料庫employeeExample Databases進行測試。

本次測試是基於employees表以及新建的employees_ptarc表。

  • 創建測試表employees_ptarc
mysql [email protected]:employees> show create table employees_ptarc;
+-----------------+-----------------------------------------+
| Table           | Create Table                            |
+-----------------+-----------------------------------------+
| employees_ptarc | CREATE TABLE `employees_ptarc` (        |
|                 |   `id` int(11) NOT NULL AUTO_INCREMENT, |
|                 |   `v_int` int(11) DEFAULT NULL,         |
|                 |   `v_string` varchar(50) DEFAULT NULL,  |
|                 |   `s_string` char(20) NOT NULL,         |
|                 |   PRIMARY KEY (`id`)                    |
|                 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8    |
+-----------------+-----------------------------------------+
1 row in set
Time: 0.019s
  • 創建存儲過程i_employees_ptarc插入測試數據
delimiter $$
CREATE PROCEDURE i_employees_ptarc (IN row_num INT)
BEGIN

DECLARE i INT DEFAULT 0 ;
WHILE i < row_num DO
    INSERT INTO employees_ptarc (v_int, v_string, s_string)
VALUES
    (
        floor(1 + rand() * 1000000),
        substring(
            MD5(RAND()),
            1,
            floor(1 + rand() * 20)
        ),
        substring(MD5(RAND()), 1, 20)
    ) ;
SET i = i + 1 ;
END
WHILE ; END$$

delimiter ;

mysql [email protected]:employees> call i_employees_ptarc(200000);
Query OK, 1 row affected
Time: 697.054s
  • 測試表employees_ptarc基本信息
mysql [email protected]:employees> select min(id),max(id) from employees_ptarc;
+---------+---------+
| min(id) | max(id) |
+---------+---------+
| 1       | 200000  |
+---------+---------+
1 row in set
Time: 0.025s
mysql [email protected]:employees> select count(*) from employees_ptarc;
+----------+
| count(*) |
+----------+
| 200000   |
+----------+
1 row in set
Time: 0.064s
mysql [email protected]:employees> select auto_increment from information_schema.tables where table_schema = 'employees' and table_name = 'employees_ptarc';
+----------------+
| auto_increment |
+----------------+
| 200001         |
+----------------+
1 row in set
Time: 0.029s

表歸檔到表(逐行進行)

  • 歸檔表數據,但不刪除源端表已歸檔數據
-- 需要歸檔的數據量
mysql [email protected]:employees> select count(*) from employees where first_name = 'Anneke';
+----------+
| count(*) |
+----------+
| 225      |
+----------+
1 row in set
Time: 0.025s

-- 執行歸檔操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --dest h=192.168.58.3,P=3308,u=admin,D=test,t=employees_arc,A=utf8 --charset=utf8 --where 'first_name = 'Anneke'' --progress 50 --txn-size=1000 --statistics --no-delete --ask-pass
Enter password:
Enter password:

DBD::mysql::db selectrow_hashref failed: Table 'test.employees_arc' doesn't exist [for Statement "SHOW CREATE TABLE `test`.`employees_arc`"] at /usr/bin/pt-archiver line 1923, <STDIN> line 2.

通過報錯信息可以看出目標端表不存在,先創建目標端表,與源端表結構一致,再進行歸檔操作。

-- 創建目標端表
percona [email protected]:test> show create table employees_arc;
+---------------+----------------------------------------------------+
| Table         | Create Table                                       |
+---------------+----------------------------------------------------+
| employees_arc | CREATE TABLE `employees_arc` (                     |
|               |   `emp_no` int(11) NOT NULL,                       |
|               |   `birth_date` date NOT NULL,                      |
|               |   `first_name` varchar(14) NOT NULL,               |
|               |   `last_name` varchar(16) NOT NULL,                |
|               |   `gender` enum('M','F') NOT NULL,                 |
|               |   `hire_date` date NOT NULL,                       |
|               |   PRIMARY KEY (`emp_no`),                          |
|               |   KEY `idx_first_last` (`first_name`,`last_name`), |
|               |   KEY `idx_birth_hire` (`birth_date`,`hire_date`), |
|               |   KEY `idx_empno` (`emp_no`)                       |
|               | ) ENGINE=InnoDB DEFAULT CHARSET=utf8               |
+---------------+----------------------------------------------------+
1 row in set
Time: 0.024s

-- 再次進行歸檔操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --dest h=192.168.58.3,P=3308,u=admin,D=test,t=employees_arc,A=utf8 --charset=utf8 --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --statistics --no-delete --ask-pass
Enter password:
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:31:36       0       0
2019-04-16T10:31:37       0      50
2019-04-16T10:31:37       0     100
2019-04-16T10:31:37       0     150
2019-04-16T10:31:37       0     200
2019-04-16T10:31:37       0     225
Started at 2019-04-16T10:31:36, ended at 2019-04-16T10:31:37
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees,u=admin
Dest:   A=utf8,D=test,P=3308,h=192.168.58.3,p=...,t=employees_arc,u=admin
SELECT 225
INSERT 225
DELETE 0
Action         Count       Time        Pct
select           114     0.5027      80.47
inserting        225     0.0572       9.15
commit             2     0.0469       7.50
other              0     0.0180       2.88

-- 查詢源表和歸檔表的歸檔數據量
mysql [email protected]:employees> select count(*) from employees where first_name = 'Anneke';
+----------+
| count(*) |
+----------+
| 225      |
+----------+
1 row in set
Time: 0.049s

percona [email protected]:test> select count(*) from employees_arc where first_name = 'Anneke';
+----------+
| count(*) |
+----------+
| 225      |
+----------+
1 row in set
Time: 0.023s

表歸檔到表(批量進行)

批量進行歸檔涉及的選項是--limit,批量進行插入涉及的選項為--bulk-insert,指定選項--bulk-insert同時也會指定選項--bulk-delete,如果不刪除已歸檔數據,則需要指定選項--no-delete

# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --dest h=192.168.58.3,P=3308,u=admin,D=test,t=employees_arc,A=utf8 --charset=utf8 --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --limit=50 --statistics --no-delete --bulk-insert --ask-pass
Enter password:
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:34:17       0       0
2019-04-16T10:34:17       0      50
2019-04-16T10:34:17       0     100
2019-04-16T10:34:17       0     150
2019-04-16T10:34:17       0     200
2019-04-16T10:34:17       0     225
Started at 2019-04-16T10:34:17, ended at 2019-04-16T10:34:17
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees,u=admin
Dest:   A=utf8,D=test,P=3308,h=192.168.58.3,p=...,t=employees_arc,u=admin
SELECT 225
INSERT 225
DELETE 0
Action              Count       Time        Pct
select                  6     0.1171      81.13
bulk_inserting          5     0.0086       5.98
commit                  2     0.0025       1.72
print_bulkfile        225    -0.0004      -0.25
other                   0     0.0165      11.42

表歸檔到文件

表歸檔到文件將選項--dest換成--file,並且根據需要添加選項--output-format

# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --file='/data/employees_arc_%Y-%m-%d.sql' --charset=utf8 --output-format='dump' --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --limit=50 --statistics --no-delete --ask-pass
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:36:02       0       0
2019-04-16T10:36:02       0      50
2019-04-16T10:36:02       0     100
2019-04-16T10:36:02       0     150
2019-04-16T10:36:02       0     200
2019-04-16T10:36:02       0     225
Started at 2019-04-16T10:36:02, ended at 2019-04-16T10:36:02
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees,u=admin
SELECT 225
INSERT 0
DELETE 0
Action          Count       Time        Pct
select              6     0.1253      93.68
print_file        225     0.0004       0.33
commit              1     0.0001       0.05
other               0     0.0079       5.93

表清除數據

如果只是進行表數據清除操作而不做歸檔操作,則可以忽略選項--dest--file,通過指定選項--purge,可以先使用選項--dry-run列印查詢需要清除數據的執行語句,做好確認之後再執行。

-- 先使用選項--dry-run
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --purge --charset=utf8 --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --limit=50 --statistics --ask-pass --dry-run
Enter password:

SELECT /*!40001 SQL_NO_CACHE */ `emp_no`,`birth_date`,`first_name`,`last_name`,`gender`,`hire_date` FROM `employees`.`employees` FORCE INDEX(`PRIMARY`) WHERE (first_name = 'Anneke') ORDER BY `emp_no` LIMIT 50
SELECT /*!40001 SQL_NO_CACHE */ `emp_no`,`birth_date`,`first_name`,`last_name`,`gender`,`hire_date` FROM `employees`.`employees` FORCE INDEX(`PRIMARY`) WHERE (first_name = 'Anneke') AND ((`emp_no` >= ?)) ORDER BY `emp_no` LIMIT 50
DELETE FROM `employees`.`employees` WHERE (`emp_no` = ?)

-- 執行清除操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --purge --charset=utf8 --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --limit=50 --statistics --ask-pass
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:40:57       0       0
2019-04-16T10:40:57       0      50
2019-04-16T10:40:58       0     100
2019-04-16T10:40:58       0     150
2019-04-16T10:40:58       0     200
2019-04-16T10:40:58       0     225
Started at 2019-04-16T10:40:57, ended at 2019-04-16T10:40:58
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees,u=admin
SELECT 225
INSERT 0
DELETE 225
Action        Count       Time        Pct
deleting        225     0.6943      79.10
select            6     0.1386      15.79
commit            1     0.0265       3.02
other             0     0.0183       2.08

-- 也可以使用選項--bulk-delete進行批量清除
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees,A=utf8 --purge --charset=utf8 --where "first_name = 'Anneke'" --progress=50 --txn-size=1000 --limit=50 --bulk-delete --statistics --ask-pass
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:43:07       0       0
2019-04-16T10:43:07       0      50
2019-04-16T10:43:07       0     100
2019-04-16T10:43:07       0     150
2019-04-16T10:43:07       0     200
2019-04-16T10:43:07       0     225
Started at 2019-04-16T10:43:07, ended at 2019-04-16T10:43:07
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees,u=admin
SELECT 225
INSERT 0
DELETE 225
Action             Count       Time        Pct
select                 6     0.1131      66.43
bulk_deleting          5     0.0384      22.54
commit                 1     0.0153       8.97
other                  0     0.0035       2.06

表自增欄位處理

預設情況下,pt-archiver工具在進行表數據歸檔或是清除時,通過添加WHERE子句條件限制具有AUTO_INCREMENT屬性欄位所對應的數據行操作,這是為了在資料庫重啟之後,之前AUTO_INCREMENT對應的值還可以使用(),但這會造成歸檔數據少一條或是清除數據少一條的情況。

-- 待歸檔數據表employees_ptarc信息
可以查看'環境與數據準備'信息。

-- 指定選項--dry-run執行歸檔操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --dest h=192.168.58.3,P=3308,u=admin,D=test,t=employees_ptarc,A=utf8 --charset=utf8 --where "1 = 1" --progress=10000 --txn-size=10000 --limit=10000 --statistics --no-delete --bulk-insert --ask-pass --dry-run
Enter password:
Enter password:

SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (1 = 1) AND (`id` < '200000') ORDER BY `id` LIMIT 10000
SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (1 = 1) AND (`id` < '200000') AND ((`id` > ?)) ORDER BY `id` LIMIT 10000
LOAD DATA LOCAL INFILE ? INTO TABLE `test`.`employees_ptarc`CHARACTER SET utf8(`id`,`v_int`,`v_string`,`s_string`)

-- 指定選項--dry-run執行清除操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --purge --charset=utf8 --where "1 = 1" --progress=10000 --txn-size=10000 --limit=10000 --statistics --bulk-delete --ask-pass --dry-run
Enter password:

SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (1 = 1) AND (`id` < '200000') ORDER BY `id` LIMIT 10000
SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (1 = 1) AND (`id` < '200000') AND ((`id` >= ?)) ORDER BY `id` LIMIT 10000
DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= ?))) AND (((`id` <= ?))) AND (1 = 1) LIMIT 10000

可以看出工具在執行查詢歸檔數據的語句時,指定了條件id < 200000,而實際上表中是有id = 200000這條數據的,並且在歸檔操作時並沒有指定條件排除這條語句,顯然是pt-archiver工具自動添加的條件。

這樣可以避免AUTO_INCREMENT屬性的值在資料庫重啟後還可以重用,可以做如下測試說明:

-- 表employees_ptarc當前的AUTO_INCREMENT屬性值
mysql [email protected]:employees> select auto_increment from information_schema.tables where table_schema = 'employees' and table_name = 'employees_ptarc';
+----------------+
| auto_increment |
+----------------+
| 200001         |
+----------------+
1 row in set
Time: 0.048s

-- 需要清除的數據量
mysql [email protected]:employees> select count(*) from employees_ptarc where id <=199990 or id > 199995;
+----------+
| count(*) |
+----------+
| 199995   |
+----------+
1 row in set
Time: 0.102s

-- 執行數據清除操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --purge --charset=utf8 --where "id <= 199990 or id > 199995" --progress=50000 --txn-size=50000 --limit=50000 --statistics --bulk-delete --ask-pass
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:47:59       0       0
2019-04-16T10:48:00       0   50000
2019-04-16T10:48:00       1  100000
2019-04-16T10:48:01       2  150000
2019-04-16T10:48:02       2  199994
Started at 2019-04-16T10:47:59, ended at 2019-04-16T10:48:02
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees_ptarc,u=admin
SELECT 199994
INSERT 0
DELETE 199994
Action             Count       Time        Pct
bulk_deleting          4     0.9030      28.23
select                 5     0.2095       6.55
commit                 4     0.1562       4.88
other                  0     1.9298      60.33

可以看出只清除了199994行數據。

-- 查詢未清除數據
mysql [email protected]:employees> select * from employees_ptarc;
+--------+--------+---------------+----------------------+
| id     | v_int  | v_string      | s_string             |
+--------+--------+---------------+----------------------+
| 199991 | 60305  | 526ed         | 0240a2d81e255c915b5a |
| 199992 | 546438 | a85b6a18d     | 0bf1d636cd0e536eb044 |
| 199993 | 543327 | 1367a1c       | 68908231ca18ed631907 |
| 199994 | 99632  | 2f            | 5c10f8d106a30bb1ef95 |
| 199995 | 164172 | e57bba13eb3c1 | 3208ac758bd8c912c39f |
| 200000 | 108936 | 3bc1db70b     | 079f744bf2800ad62a9b |
+--------+--------+---------------+----------------------+
6 rows in set
Time: 0.018s

-- 重啟後,查詢當前AUTO_INCREMENT屬性值
mysql [email protected]:employees> select auto_increment from information_schema.tables where table_schema = 'employees' and table_name = 'employees_ptarc';
+----------------+
| auto_increment |
+----------------+
| 200001         |
+----------------+
1 row in set
Time: 0.014s

為了不保護AUTO_INCREMENT屬性最大值的數據行,工具提供了選項--no-safe-auto-increment,指定該選項後再進行測試:

-- 指定選項--dry-run執行清除操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --purge --charset=utf8 --where "id <= 199990 or id > 199995" --progress=50000 --txn-size=50000 --limit=50000 --statistics --bulk-delete --no-safe-auto-increment --ask-pass --dry-run
Enter password:

SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199990 or id > 199995) ORDER BY `id` LIMIT 50000
SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199990 or id > 199995) AND ((`id` >= ?)) ORDER BY `id` LIMIT 50000
DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= ?))) AND (((`id` <= ?))) AND (id <= 199990 or id > 199995) LIMIT 50000

從以上信息看出並沒有對AUTO_INCREMENT屬性欄位最大值進行排除。

-- 執行數據清除操作
# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --purge --charset=utf8 --where "id <= 199990 or id > 199995" --progress=50000 --txn-size=50000 --limit=50000 --statistics --bulk-delete --no-safe-auto-increment --ask-pass
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:52:19       0       0
2019-04-16T10:52:20       0   50000
2019-04-16T10:52:20       1  100000
2019-04-16T10:52:21       1  150000
2019-04-16T10:52:22       2  199995
Started at 2019-04-16T10:52:19, ended at 2019-04-16T10:52:22
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees_ptarc,u=admin
SELECT 199995
INSERT 0
DELETE 199995
Action             Count       Time        Pct
bulk_deleting          4     0.7500      27.80
select                 5     0.1851       6.86
commit                 4     0.0622       2.30
other                  0     1.7007      63.03

可以看出清除了199995行數據。

-- 查詢未清除數據
mysql [email protected]:employees> select * from employees_ptarc;
+--------+--------+---------------+----------------------+
| id     | v_int  | v_string      | s_string             |
+--------+--------+---------------+----------------------+
| 199991 | 60305  | 526ed         | 0240a2d81e255c915b5a |
| 199992 | 546438 | a85b6a18d     | 0bf1d636cd0e536eb044 |
| 199993 | 543327 | 1367a1c       | 68908231ca18ed631907 |
| 199994 | 99632  | 2f            | 5c10f8d106a30bb1ef95 |
| 199995 | 164172 | e57bba13eb3c1 | 3208ac758bd8c912c39f |
+--------+--------+---------------+----------------------+
5 rows in set
Time: 0.027s

-- 重啟後,查詢當前AUTO_INCREMENT屬性值
mysql [email protected]:employees> select auto_increment from information_schema.tables where table_schema = 'employees' and table_name = 'employees_ptarc';
+----------------+
| auto_increment |
+----------------+
| 199996         |
+----------------+
1 row in set
Time: 0.046s

從以上查詢信息可以看出AUTO_INCREMENT屬性值發生了變化。如果要恢覆成之前的狀態值,可以通過手動執行命令進行修複:

mysql [email protected]:employees> alter table employees_ptarc auto_increment = 200001;
Query OK, 0 rows affected
Time: 0.013s

mysql [email protected]:employees> select auto_increment from information_schema.tables where table_schema = 'employees' and table_name = 'employees_ptarc';
+----------------+
| auto_increment |
+----------------+
| 200001         |
+----------------+
1 row in set
Time: 0.020s

工作流程

分別開啟兩個實例的general log來瞭解pt-archiver工具的工作流程,工作流程是基於表歸檔到表(批量進行)這個用法來說明,同時刪除源端表的已歸檔數據。

執行命令如下:

# pt-archiver --source h=192.168.58.3,P=3306,u=admin,D=employees,t=employees_ptarc,A=utf8 --dest h=192.168.58.3,P=3308,u=admin,D=test,t=employees_ptarc,A=utf8 --charset=utf8 --where "id <= 199995" --progress=50000 --txn-size=50000 --limit=50000 --statistics --bulk-insert --ask-pass
Enter password:
Enter password:

TIME                ELAPSED   COUNT
2019-04-16T10:56:18       0       0
2019-04-16T10:56:19       1   50000
2019-04-16T10:56:21       2  100000
2019-04-16T10:56:23       4  150000
2019-04-16T10:56:24       6  199995
Started at 2019-04-16T10:56:18, ended at 2019-04-16T10:56:25
Source: A=utf8,D=employees,P=3306,h=192.168.58.3,p=...,t=employees_ptarc,u=admin
Dest:   A=utf8,D=test,P=3308,h=192.168.58.3,p=...,t=employees_ptarc,u=admin
SELECT 199995
INSERT 199995
DELETE 199995
Action              Count       Time        Pct
bulk_inserting          4     1.3027      19.51
bulk_deleting           4     0.7103      10.64
select                  5     0.1872       2.80
commit                  8     0.1455       2.18
print_bulkfile     199995    -0.3881      -5.81
other                   0     4.7192      70.68
  • 源端實例general log
-- 初始的一些檢查資料庫參數、負載信息
13 Connect  admin@dbabd1 on employees using TCP/IP
13 Query    set autocommit=0
13 Query    /*!40101 SET NAMES "utf8"*/
13 Query    SHOW VARIABLES LIKE 'wait\_timeout'
13 Query    SET SESSION wait_timeout=10000
13 Query    SELECT @@SQL_MODE
13 Query    SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
13 Query    SELECT version()
13 Query    SHOW VARIABLES LIKE 'version%'
13 Query    SHOW ENGINES
13 Query    SHOW VARIABLES LIKE 'innodb_version'
13 Query    show variables like 'innodb_rollback_on_timeout'
13 Query    /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */
13 Query    USE `employees`
13 Query    SHOW CREATE TABLE `employees`.`employees_ptarc`
13 Query    /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
13 Query    SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
13 Query    SHOW VARIABLES LIKE 'wsrep_on'
13 Query    SHOW VARIABLES LIKE 'wsrep_on'
13 Query    SHOW VARIABLES LIKE 'version%'
13 Query    SHOW ENGINES
13 Query    SHOW VARIABLES LIKE 'innodb_version'

-- 確定歸檔數據最大邊界值,根據主鍵還有選項--limit確定每次歸檔的數據
13 Query    SELECT MAX(`id`) FROM `employees`.`employees_ptarc`
13 Query    SELECT CONCAT(@@hostname, @@port)
13 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199995) AND (`id` < '200000') ORDER BY `id` LIMIT 50000
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'

……省略……

13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    commit
13 Query    SELECT 'pt-archiver keepalive'

-- 歸檔完數據之後根據是否有選項--no-delete進行刪除操作
13 Query    DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= '1'))) AND (((`id` <= '50000'))) AND (id <= 199995) LIMIT 50000

-- 進行接下去的數據歸檔操作
13 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199995) AND (`id` < '200000') AND ((`id` >= '50000')) ORDER BY `id` LIMIT 50000
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'

……省略……

13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    commit
13 Query    SELECT 'pt-archiver keepalive'
13 Query    DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= '50001'))) AND (((`id` <= '100000'))) AND (id <= 199995) LIMIT 50000
13 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199995) AND (`id` < '200000') AND ((`id` >= '100000')) ORDER BY `id` LIMIT 50000
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'

……省略……

13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    commit
13 Query    SELECT 'pt-archiver keepalive'
13 Query    DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= '100001'))) AND (((`id` <= '150000'))) AND (id <= 199995) LIMIT 50000
13 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199995) AND (`id` < '200000') AND ((`id` >= '150000')) ORDER BY `id` LIMIT 50000
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'

……省略……

13 Query    SELECT 'pt-archiver keepalive'
13 Query    SELECT 'pt-archiver keepalive'
13 Query    DELETE FROM `employees`.`employees_ptarc` WHERE (((`id` >= '150001'))) AND (((`id` <= '199995'))) AND (id <= 199995) LIMIT 50000

-- 完成最後查詢是否還有歸檔數據
13 Query    SELECT /*!40001 SQL_NO_CACHE */ `id`,`v_int`,`v_string`,`s_string` FROM `employees`.`employees_ptarc` FORCE INDEX(`PRIMARY`) WHERE (id <= 199995) AND (`id` < '200000') AND ((`id` >= '199995')) ORDER BY `id` LIMIT 50000
13 Query    commit
13 Quit 
  • 目標端實例general log
-- 初始的一些檢查資料庫參數、負載信息
62 Connect  admin@dbabd1 on test using TCP/IP
62 Query    set autocommit=0
62 Query    /*!40101 SET NAMES "utf8"*/
62 Query    SHOW VARIABLES LIKE 'wait\_timeout'
62 Query    SET SESSION wait_timeout=10000
62 Query    SELECT @@SQL_MODE
62 Query    SET @@SQL_QUOTE_SHOW_CREATE = 1/*!40101, @@SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'*/
62 Query    SELECT version()
62 Query    SHOW VARIABLES LIKE 'version%'
62 Query    SHOW ENGINES
62 Query    SHOW VARIABLES LIKE 'innodb_version'
62 Query    show variables like 'innodb_rollback_on_timeout'
62 Query    /*!40101 SET @OLD_SQL_MODE := @@SQL_MODE, @@SQL_MODE := '', @OLD_QUOTE := @@SQL_QUOTE_SHOW_CREATE, @@SQL_QUOTE_SHOW_CREATE := 1 */

-- 切換進入目標端資料庫
62 Query    USE `test`
62 Query    SHOW CREATE TABLE `test`.`employees_ptarc`
62 Query    /*!40101 SET @@SQL_MODE := @OLD_SQL_MODE, @@SQL_QUOTE_SHOW_CREATE := @OLD_QUOTE */
62 Query    SELECT CONCAT(/*!40100 @@session.character_set_connection, */ "")
62 Query    SELECT CONCAT(@@hostname, @@port)
62 Query    commit

-- 批量插入選項--bulk-insert是通過LOAD DATA INFILE方式生成臨時文件進行導入
62 Query    LOAD DATA LOCAL INFILE '/tmp/UGeTe6hEIPpt-archiver' INTO TABLE `test`.`employees_ptarc`CHARACTER SET utf8(`id`,`v_int`,`v_string`,`s_string`)
62 Query    commit
62 Query    LOAD DATA LOCAL INFILE '/tmp/PNNmzgvqx6pt-archiver' INTO TABLE `test`.`employees_ptarc`CHARACTER SET utf8(`id`,`v_int`,`v_string`,`s_string`)
62 Query    commit
62 Query    LOAD DATA LOCAL INFILE '/tmp/pJDb48JQvQpt-archiver' INTO TABLE `test`.`employees_ptarc`CHARACTER SET utf8(`id`,`v_int`,`v_string`,`s_string`)
62 Query    LOAD DATA LOCAL INFILE '/tmp/xvb0NmYJiGpt-archiver' INTO TABLE `test`.`employees_ptarc`CHARACTER SET utf8(`id`,`v_int`,`v_string`,`s_string`)
62 Query    commit
62 Quit 

總結

  1. pt-archiver是一個十分高效的表數據歸檔工具,歸檔數據可以分批進行事務處理,減少性能消耗;
  2. 如果實例開啟了GTID,因為GTID不支持CTAS創建表的語法,可以使用pt-archiver處理;
  3. 對於跨實例或者跨伺服器的表數據歸檔,pt-archiver可以運行在目標端伺服器,因為生成的臨時文件是在工具執行所在的伺服器。
  4. 對於大表的過期數據的批量刪除也可以通過pt-archiver指定選項--purge進行處理。

參考

https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html

☆〖本人水平有限,文中如有錯誤還請留言批評指正!〗☆


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雲伺服器ESC 部署vsftpd 虛擬用戶 說明:雲伺服器部署和本地伺服器部署一樣,都需要開通指定的相應埠,只不過雲伺服器需要在安全組規則中打開相應的埠允許通過。 環境說明: 對應的用戶對應不同的密碼,對應不同的數據目錄,如下圖: 具體步驟 1) 安裝軟體 2) 創建相應的ftp數據目錄 3) ...
  • LVS
    LVS 概述.V1 LVS LVS lvs是一款開源的負責均衡調度器應用,工作於傳輸層。負責把客戶端請求按調度演算法轉發只後端伺服器集群中的主機進行響應。 LVS組成 LVS組成 ipvsadm:ipvsadm是工作於用戶工作,用戶通過ipvsadm工具定義lvs的工作機制,集群,規則以及演算法。 ip ...
  • sed:文本流編輯器 主要是對文件的快速增刪改查,查詢功能中最常用的是過濾,取行 sed [選項] [sed內置命令字元] [輸入文件] Options: -n:取消預設的sed輸出,常與sed內置命令p連用 -e:直接在命令行界面進行sed動作編輯,多點編輯 -r:使用擴展的正則表達式 -i:直接 ...
  • root@VM-38-204-ubuntu:~# host baidu.com baidu.com has address 220.181.57.216 baidu.com has address 123.125.114.144 baidu.com mail is handled by 15 mx.... ...
  • grep:文本過濾工具 支持BRE egrep: 支持ERE fgrep: 不支持正則 作用:根據用戶指定的“模式”,對目標文本逐行進行匹配檢查,列印匹配到的行 模式:由正則表達式字元及文本字元所編寫的過濾條件 [OPTIONS] PATTERN [FILE...] options: -v:顯示不被 ...
  • 問題描述: 應用程式視窗能夠打開,但就是這樣一直空白,什麼都不顯示。接下來,主視窗以純白色載入,不顯示任何其他內容。 接下來主視窗背景米色載入和菜單欄載入和工作。應用程式將永遠保持這樣, 有時界面會變成黑色。打開任務管理器,會看到有一堆Postman進程正在運行。 系統Windows Server ...
  • 本文主要介紹了MongoDB及Mongoose,並通過使用Mongoose對文檔進行增刪改查操作。 ...
  • memcached 是什麼 特點 協議簡單 基於 libevent 的事件處理 內置記憶體存儲方式 memcached 不互相通信的分散式 啟動 安裝 依賴 libevent 安裝命令 下載地址在這個網址上面找: "https://memcached.org/downloads" 啟動 啟動命令 $ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...