MySQL 官方出品,比 mydumper 更快的多線程邏輯備份工具-MySQL Shell Dump & Load

来源:https://www.cnblogs.com/ivictor/archive/2022/05/30/16326495.html
-Advertisement-
Play Games

mysqldump 和 mydumper 是我們常用的兩個邏輯備份工具。 無論是 mysqldump 還是 mydumper 都是將備份數據通過 INSERT 的方式寫入到備份文件中。 恢復時,myloader( mydumper 中的恢復工具 ) 是多線程導入,且一個 INSERT 語句中包含多條 ...


mysqldump 和 mydumper 是我們常用的兩個邏輯備份工具。

無論是 mysqldump 還是 mydumper 都是將備份數據通過 INSERT 的方式寫入到備份文件中。

恢復時,myloader( mydumper 中的恢復工具 ) 是多線程導入,且一個 INSERT 語句中包含多條記錄,多個 INSERT 操作批量提交。基本上,凡是我們能想到的,有助於提升導入速度的,myloader 都會使用或有選項提供。

單就恢復速度而言,可以說,myloader 就是邏輯恢復工具的天花板。

既然如此,還有辦法能繼續提升邏輯恢復工具的恢復速度麽?畢竟,備份的恢復速度直接影響著災難發生時資料庫服務的 RTO。

答案,有!

這個就是官方在 MySQL Shell 8.0.21 中推出的 Dump & Load 工具。

與 myloader 不一樣的是,MySQL Shell Load 是通過 LOAD DATA LOCAL INFILE 命令來導入數據的。

而 LOAD DATA 操作,按照官方文檔的說法,比 INSERT 操作快 20 倍。

下麵,我們看看 MySQL Shell Dump & Load 的具體用法和實現原理。

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

  1. 什麼是 MySQL Shell。
  2. MySQL Shell的安裝。
  3. MySQL Shell Dump & Load的使用。
  4. util.dumpInstance的關鍵特性。
  5. util.loadDump的關鍵特性。
  6. util.dumpInstance的備份流程。
  7. util.dumpInstance的參數解析。
  8. util.loadDump的參數解析。
  9. 使用 MySQL Shell Dump & Load時的註意事項。

 

什麼是 MySQL Shell

MySQL Shell 是 MySQL 的一個高級客戶端和代碼編輯器,是第二代 MySQL 客戶端。第一代 MySQL 客戶端即我們常用的 mysql。

相比於 mysql,MySQL Shell 不僅支持 SQL,還具有以下關鍵特性:

  1. 支持 Python 和 JavaScript 兩種語言模式。基於此,我們可以很容易地進行一些腳本開發工作。
  2. 支持 AdminAPI。AdminAPI 可用來管理 InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet。
  3. 支持 X DevAPI。X DevAPI 可對文檔( Document )和表( Table )進行 CRUD(Create,Read,Update,Delete)操作。

除此之外,MySQL Shell 還內置了很多實用工具,包括:

  • checkForServerUpgrade:檢測目標實例能否升級到指定版本。

  • dumpInstance:備份實例。

  • dumpSchemas:備份指定庫。

  • dumpTables:備份指定表。

  • loadDump:恢復通過上面三個工具生成的備份。

  • exportTable:將指定的表導出到文本文件中。只支持單表,效果同 SELECT INTO OUTFILE 一樣。

  • importTable:將指定文本的數據導入到表中。

    線上上,如果我們有個大文件需要導入,建議使用這個工具。它會將單個文件進行拆分,然後多線程並行執行 LOAD DATA LOCAL INFILE 操作。不僅提升了導入速度,還規避了大事務的問題。

  • importJson:將 JSON 格式的數據導入到 MySQL 中,譬如將 MongoDB 中通過 mongoexport 導出的數據導入到 MySQL 中。

在使用時註意:

  1. 通過 dumpInstance,dumpSchemas,dumpTables 生成的備份只能通過 loadDump 來恢復。
  2. 通過 exportTable 生成的備份只能通過 importTable 來恢復。

下麵,我們重點說說 Dump & Load 相關的工具,包括 dumpInstance,dumpSchemas,dumpTables 和 loadDump。

 

MySQL Shell 的安裝

MySQL Shell 下載地址:https://dev.mysql.com/downloads/shell/。

同 MySQL 一樣,提供了多個版本的下載。這裡使用 Linux 二進位版本( Linux - Generic )。

# cd /usr/local/
# wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.29-linux-glibc2.12-x86-64bit.tar.gz
# tar xvf mysql-shell-8.0.29-linux-glibc2.12-x86-64bit.tar.gz 
# ln -s mysql-shell-8.0.29-linux-glibc2.12-x86-64bit mysql-shell
# export PATH=$PATH:/usr/local/mysql-shell/bin

 

MySQL Shell Dump & Load 的使用

util.dumpInstance(outputUrl[, options])

備份實例。

其中,outputUrl 是備份目錄,其必須為空。options 是可指定的選項。

首先,看一個簡單的示例。

# mysqlsh -h 10.0.20.4 -P3306 -uroot -p
mysql-js> util.dumpInstance('/data/backup/full',{compression: "none"})
Acquiring global read lock
Global read lock acquired
Initializing - done
1 out of 5 schemas will be dumped and within them 1 table, 0 views.
4 out of 7 users will be dumped.
Gathering information - done
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done
Writing DDL - done
Writing table metadata - done
Starting data dump
101% (650.00K rows / ~639.07K rows), 337.30K rows/s, 65.89 MB/s
Dump duration: 00:00:01s
Total duration: 00:00:01s
Schemas dumped: 1
Tables dumped: 1
Data size: 126.57 MB
Rows written: 650000
Bytes written: 126.57 MB
Average throughput: 65.30 MB/s

命令中的 /data/backup/full 是備份目錄,compression: "none" 指的是不壓縮,這裡設置為不壓縮主要是為了方便查看數據文件的內容。線上使用建議開啟壓縮。


接下來我們看看備份目錄中的內容。

# ll /data/backup/full/
total 123652
-rw-r----- 1 root root      273 May 25 21:13 @.done.json
-rw-r----- 1 root root      854 May 25 21:13 @.json
-rw-r----- 1 root root      240 May 25 21:13 @.post.sql
-rw-r----- 1 root root      288 May 25 21:13 sbtest.json
-rw-r----- 1 root root 63227502 May 25 21:13 sbtest@[email protected]
-rw-r----- 1 root root      488 May 25 21:13 sbtest@[email protected]
-rw-r----- 1 root root 63339214 May 25 21:13 sbtest@sbtest1@@1.tsv
-rw-r----- 1 root root      488 May 25 21:13 sbtest@sbtest1@@1.tsv.idx
-rw-r----- 1 root root      633 May 25 21:13 [email protected]
-rw-r----- 1 root root      759 May 25 21:13 [email protected]
-rw-r----- 1 root root      535 May 25 21:13 sbtest.sql
-rw-r----- 1 root root      240 May 25 21:13 @.sql
-rw-r----- 1 root root     6045 May 25 21:13 @.users.sql

其中,

  • @.done.json:會記錄備份的結束時間,備份集的大小。備份結束時生成。

  • @.json:會記錄備份的一些元數據信息,包括備份時的一致性位置點信息:binlogFile,binlogPosition 和 gtidExecuted,這些信息可用來建立複製。

  • @.sql,@.post.sql:這兩個文件只有一些註釋信息。不過在通過 util.loadDump 導入數據時,我們可以通過這兩個文件自定義一些 SQL。其中,@.sql 是數據導入前執行,@.post.sql 是數據導入後執行。

  • sbtest.json:記錄 sbtest 中已經備份的表、視圖、定時器、函數和存儲過程。

  • *.tsv:數據文件。我們看看數據文件的內容。

    # head -2 sbtest@[email protected]
    1 6461363 68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441 22195207048-70116052123-74140395089-76317954521-98694025897
    2 1112248 13241531885-45658403807-79170748828-69419634012-13605813761-77983377181-01582588137-21344716829-87370944992-02457486289 28733802923-10548894641-11867531929-71265603657-36546888392

    TSV 格式,每一行儲存一條記錄,欄位與欄位之間用製表符(\t)分隔。

  • [email protected]:記錄了表相關的一些元數據信息,如列名,欄位之間的分隔符(fieldsTerminatedBy)等。

  • [email protected]:sbtest.sbtest1 的建表語句。

  • sbtest.sql:建庫語句。如果這個庫中存在存儲過程、函數、定時器,也是寫到這個文件中。

  • @.users.sql:創建賬號及授權語句。預設不會備份 mysql.session,mysql.session,mysql.sys 這三個內部賬號。


util.dumpSchemas(schemas, outputUrl[, options])

備份指定庫的數據。

用法同 util.dumpInstance 類似。其中,第一個參數必須為數組,即使只需備份一個庫,如,

util.dumpSchemas(['sbtest'],'/data/backup/schema')

支持的配置大部分與 util.dumpInstance 相同。

從 MySQL Shell 8.0.28 開始,可直接使用 util.dumpInstance 中的 includeSchemas 選項進行指定庫的備份。


util.dumpTables(schema, tables, outputUrl[, options])

備份指定表的數據。

用法同 util.dumpInstance 類似。其中,第二個參數必須為數組,如,

util.dumpTables('sbtest',['sbtest1'],'/data/backup/table')

支持的配置大部分與 util.dumpInstance 相同。

從 MySQL Shell 8.0.28 開始,可直接使用 util.dumpInstance 中的 includeTables 選項進行指定表的備份。


util.loadDump(url[, options])

導入通過 dump 命令生成的備份集。如,

# mysqlsh -S /data/mysql/3307/data/mysql.sock
mysql-js> util.loadDump("/data/backup/full",{loadUsers: true})
Loading DDL, Data and Users from '/data/backup/full' using 4 threads.
Opening dump...
Target is MySQL 8.0.27. Dump was produced from MySQL 8.0.27
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
2 thds loading - 100% (126.57 MB / 126.57 MB), 11.43 MB/s, 0 / 1 tables done
Recreating indexes - done
Executing user accounts SQL...
NOTE: Skipping CREATE/ALTER USER statements for user 'root'@'localhost'
NOTE: Skipping GRANT statements for user 'root'@'localhost'
Executing common postamble SQL
2 chunks (650.00K rows, 126.57 MB) for 1 tables in 1 schemas were loaded in 10 sec (avg throughput 13.96 MB/s)
0 warnings were reported during the load.

命令中的 /data/backup/full 是備份目錄,loadUsers: true 是導入賬號,預設不會導入。

 

util.dumpInstance 的關鍵特性

util.dumpInstance 的關鍵特性如下:

  1. 多線程備份。併發線程數由 threads 決定,預設是 4。
  2. 支持單表 chunk 級別的並行備份,前提是表上存在主鍵或唯一索引。
  3. 預設是壓縮備份。
  4. 支持備份限速。可通過 maxRate 限制單個線程的數據讀取速率。

 

util.loadDump 的關鍵特性

util.loadDump 的關鍵特性如下:

  1. 多線程恢復。併發線程數由 threads 決定,預設是 4。

  2. 支持斷點續傳功能。

    在導入的過程中,會在備份目錄生成一個進度文件,用於記錄導入過程中的進度信息。

    文件名由 progressFile 指定,預設是 load-progress.<server_uuid>.progress。

    導入時,如果備份目錄中存在 progressFile,預設會從上次完成的地方繼續執行。如果要從頭開始執行,需將 resetProgress 設置為 true。

  3. 支持延遲創建二級索引。

  4. 支持邊備份,邊導入。

  5. 通過 LOAD DATA LOCAL INFILE 命令來導入數據。

  6. 如果單個文件過大,util.loadDump 在導入時會自動進行切割,以避免產生大事務。

 

util.dumpInstance 的備份流程

util.dumpInstance 的備份流程如下圖所示。

圖片

不難看出,util.dumpInstance 的備份流程與 mysqldump 大致相同,不同的地方主要體現在以下兩點:

  1. util.dumpInstance 會加備份鎖。備份鎖可用來阻塞備份過程中的 DDL。
  2. util.dumpInstance 是並行備份,相對於 mysqldump 的單線程備份,備份效率更高。

 

util.dumpInstance 的參數解析

util.dumpInstance 的參數可分為如下幾類:

過濾相關

以下是過濾相關的選項。

  • excludeSchemas:忽略某些庫的備份,多個庫之間用逗號隔開,如,

    excludeSchemas: ["db1", "db2"]
  • includeSchemas:指定某些庫的備份。

  • excludeTables:忽略某些表的備份,表必須是 schema.table 的格式,多個表之間用逗號隔開,如,

    excludeTables: ["sbtest.sbtest1", "sbtest.sbtest2"]
  • includeTables:指定某些表的備份。

  • events:是否備份定時器,預設為 true。

  • excludeEvents:忽略某些定時器的備份。

  • includeEvents:指定某些定時器的備份。

  • routines:是否備份函數和存儲過程,預設為 true。

  • excludeRoutines:忽略某些函數和存儲過程的備份。

  • includeRoutines:指定某些函數和存儲過程的備份。

  • users:是否備份賬號信息,預設為 true。

  • excludeUsers:忽略某些賬號的備份,可指定多個賬號。

  • includeUsers:指定某些賬號的備份,可指定多個賬號。

  • triggers:是否備份觸發器,預設為 true。

  • excludeTriggers:忽略某些觸發器的備份。

  • includeTriggers:指定某些觸發器的備份。

  • ddlOnly:是否只備份表結構,預設為 false。

  • dataOnly:是否只備份數據,預設為 false。


並行備份相關

  • chunking:是否開啟 chunk 級別的並行備份功能,預設為 true。
  • bytesPerChunk:每個 chunk 文件的大小,預設 64M。
  • threads:併發線程數,預設為 4。

OCI(甲骨文雲)相關

  • ocimds:是否檢查備份集與 MySQL Database Service(甲骨文雲的 MySQL 雲服務,簡稱 MDS )的相容性,預設為 false,不檢查。如果設置為 true,會輸出所有的不相容項及解決方法。不相容項可通過下麵的 compatibility 來解決。

  • compatibility:如果要將備份數據導入到 MDS 中,為了保證與後者的相容性,可在導出的過程中進行相應地調整。具體來說:

    1. create_invisible_pks:對於沒有主鍵的表,會創建一個隱藏主鍵:my_row_id BIGINT UNSIGNED AUTO_INCREMENT INVISIBLE PRIMARY KEY。隱藏列是 MySQL 8.0.23 引入的。
    2. force_innodb:將表的引擎強制設置為 InnoDB。
    3. ignore_missing_pks:忽略主鍵缺失導致的錯誤,與 create_invisible_pks 互斥,不能同時指定。
    4. skip_invalid_accounts:忽略沒有密碼,或者使用了 MDS 不支持的認證插件的賬號。
    5. strip_definers:去掉視圖、存儲過程、函數、定時器、觸發器中的 DEFINER=account 子句。
    6. strip_restricted_grants:去掉 MDS 中不允許 GRANT 的許可權。
    7. strip_tablespaces:去掉建表語句中的 TABLESPACE=xxx 子句。
  • osBucketName,osNamespace,ociConfigFile,ociProfile,ociParManifest,ociParExpireTime:OCI 對象存儲相關。


其它選項

  • tzUtc:是否設置 TIME_ZONE = '+00:00',預設為 true。
  • consistent:是否開啟一致性備份,預設為 true。若設置為 false,則不會加全局讀鎖,也不會開啟事務的一致性快照。
  • dryRun:試運行。此時只會列印備份信息,不會執行備份操作。
  • maxRate:限制單個線程的數據讀取速率,單位 byte,預設為 0,不限制。
  • showProgress:是否列印進度信息,如果是 TTY 設備(命令行終端),則為 true,反之,則為 false。
  • defaultCharacterSet:字元集,預設為 utf8mb4。
  • compression:備份文件的壓縮演算法,預設為 zstd。也可設置為 gzip 或 none(不壓縮)。

 

util.loadDump 的參數解析

util.loadDump 的參數可分為如下幾類:

過濾相關

  • excludeEvents:忽略某些定時器的導入。
  • excludeRoutines:忽略某些函數和存儲過程的導入。
  • excludeSchemas:忽略某些庫的導入。
  • excludeTables:忽略某些表的導入。
  • excludeTriggers:忽略某些觸發器的導入。
  • excludeUsers:忽略某些賬號的導入。
  • includeEvents:導入指定定時器。
  • includeRoutines:導入指定函數和存儲過程。
  • includeSchemas:導入指定庫。
  • includeTables:導入指定表。
  • includeTriggers:導入指定觸發器。
  • includeUsers:導入指定賬號。
  • loadData:是否導入數據,預設為 true。
  • loadDdl:是否導入 DDL 語句,預設為 true。
  • loadUsers:是否導入賬號,預設為 false。註意,即使將 loadUsers 設置為 true,也不會導入當前正在執行導入操作的用戶。
  • ignoreExistingObjects:是否忽略已經存在的對象,預設為 off。

並行導入相關

  • backgroundThreads:獲取元數據和 DDL 文件內容的線程數。備份集如果存儲在本地,backgroundThreads 預設和 threads 一致。
  • threads:併發線程數,預設為 4。
  • maxBytesPerTransaction:指定單個 LOAD DATA 操作可載入的最大位元組數。預設與 bytesPerChunk 一致。這個參數可用來規避大事務。

斷點續傳相關

  • progressFile:在導入的過程中,會在備份目錄生成一個 progressFile,用於記錄載入過程中的進度信息,這個進度信息可用來實現斷點續傳功能。預設為 load-progress.<server_uuid>.progress。
  • resetProgress:如果備份目錄中存在 progressFile,預設會從上次完成的地方繼續執行。如果要從頭開始執行,需將 resetProgress 設置為 true。該參數預設為 off。

OCI 相關

osBucketName,osNamespace,ociConfigFile,ociProfile。


二級索引相關

  • deferTableIndexes:是否延遲(數據載入完畢後)創建二級索引。可設置:off(不延遲),fulltext(只延遲創建全文索引,預設值),all(延遲創建所有索引)。
  • loadIndexes:與 deferTableIndexes 一起使用,用來決定數據載入完畢後,最後的二級索引是否創建,預設為 true。

其它選項

  • analyzeTables:表載入完畢後,是否執行 ANALYZE TABLE 操作。預設是 off(不執行),也可設置為 on 或 histogram(只對有直方圖信息的表執行)。
  • characterSet:字元集,無需顯式設置,預設會從備份集中獲取。
  • createInvisiblePKs:是否創建隱式主鍵,預設從備份集中獲取。這個與備份時是否指定了 create_invisible_pks 有關,若指定了則為 true,反之為 false。
  • dryRun:試運行。
  • ignoreVersion:忽略 MySQL 的版本檢測。預設情況下,要求備份實例和導入實例的大版本一致。
  • schema:將表導入到指定 schema 中,適用於通過 util.dumpTables 創建的備份。
  • showMetadata:導入時是否列印一致性備份時的位置點信息。
  • showProgress:是否列印進度信息。
  • skipBinlog:是否設置 sql_log_bin=0 ,預設 false。這一點與 mysqldump、mydumper 不同,後面這兩個工具預設會禁用 Binlog。
  • updateGtidSet:更新 GTID_PURGED。可設置:off(不更新,預設值), replace(替代目標實例的 GTID_PURGED), append(追加)。
  • waitDumpTimeout:util.loadDump 可導入當前正在備份的備份集。處理完所有文件後,如果備份還沒有結束(具體來說,是備份集中沒有生成 @.done.json),util.loadDump 會報錯退出,可指定 waitDumpTimeout 等待一段時間,單位秒。

 

MySQL Shell Dump & Load 的註意事項

1. 表上存在主鍵或唯一索引才能進行 chunk 級別的並行備份。欄位的數據類型不限。不像 mydumper,分片鍵只能是整數類型。

2. 對於不能進行並行備份的表,目前會備份到一個文件中。如果該文件過大,不用擔心大事務的問題,util.loadDump 在導入時會自動進行切割。

3. util.dumpInstance 只能保證 InnoDB 表的備份一致性。

4. 預設不會備份 information_schema,mysql,ndbinfo,performance_schema,sys。

5. 備份實例支持 MySQL 5.6 及以上版本,導入實例支持 MySQL 5.7 及以上版本。

6. 備份的過程中,會將 BLOB 等非文本安全的列轉換為 Base64,由此會導致轉換後的數據大小超過原數據。導入時,註意 max_allowed_packet 的限制。

7. 導入之前,需將目標實例的 local_infile 設置為 ON。

 

參考

[1] Instance Dump Utility, Schema Dump Utility, and Table Dump Utility

[2] MySQL Shell Dump & Load part 1: Demo!

[3] MySQL Shell Dump & Load part 2: Benchmarks

[4] MySQL Shell Dump & Load part 3: Load Dump

[5] MySQL Shell Dump & Load part 4: Dump Instance & Schemas

[6] Backup/Restore Performance Conclusion: mysqldump vs MySQL Shell Utilities vs mydumper vs mysqlpump vs XtraBackup

[7] Optimizing INSERT Statements


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

-Advertisement-
Play Games
更多相關文章
  • 一、PL/SQL簡介 1)SQL是一種標準化的結構化查詢語言,在資料庫領域有著廣泛的應用和重大影響。但是SQL並不能完成一個過程所能完成的任務,如某一個條件成立進行數據插入,否則不進行數據插入。 2)PL/SQL是Oracle公司對SQL語言的擴展,全面支持所有的SQL操作與數據類型。 3)PL/S ...
  • ClickHouse的由來 ClickHouse是什麼資料庫?ClickHouse速度有多快?應用場景是怎麼樣的?ClickHouse是關係型資料庫嗎?ClickHouse目前是很火爆的一款面向OLAP的數據,可以提供秒級的大數據查詢。 Google於2003~2006年相繼發表了三篇論文“Goog ...
  • - Jedis - 優點:以 Redis 命令作為方法名稱,學習成本低廉,簡單且實用 - 缺點:Jedis 的實例是線程不安全的,在多線程的環境下需要基於線程池來使用 - lettuce(spring 官方預設) - 基於 Netty 實現的,支持同步、非同步和響應式編程方式,並且是線程安... ...
  • redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交... ...
  • 一、初識HBase HBase 是一個面向列式存儲的分散式資料庫,其設計思想來源於 Google 的 BigTable 論文。HBase 底層存儲基於 HDFS 實現,集群的管理基於 ZooKeeper 實現。HBase 良好的分散式架構設計為海量數據的快速存儲、隨機訪問提供了可能,基於數據副本機制 ...
  • UniqueMergeTree 開發的業務背景 首先,我們看一下哪些場景需要用到實時更新。 我們總結了三類場景: 第一類是業務需要對它的交易類數據進行實時分析,需要把數據流同步到 ClickHouse 這類 OLAP 資料庫中。大家知道,業務數據諸如訂單數據天生是存在更新的,所以需要 OLAP 數據 ...
  • SELECT 查詢 101 Id Title Director Year Length_minutes 1 Toy Story John Lasseter 1995 81 2 A Bug's Life John Lasseter 1998 95 3 Toy Story 2 John Lasseter ...
  • 作者:王志斌 編輯:鐘華龍 本文來自社區小伙伴 王志斌 的投稿。從小白的角度,帶你一步步實現將 RadonDB PostgreSQL 集群部署到 Kubernetes 上。文章分為上下兩部分,第一部分將為大家演示如何搭建一套 Kubernetes 環境,包括詳細的配置調優等。 什麼是 RadonDB ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...