MySQL Backup mydumper

来源:https://www.cnblogs.com/dbabd/archive/2018/12/28/10191348.html
-Advertisement-
Play Games

正文 生產環境中有一實例每天使用mysqldump備份時長達到了2個小時53分鐘,接近3個小時,還不算上備份文件歸檔的時間,這個時間對於邏輯備份來說有點久。為了提高邏輯備份效率,打算替換為使用mydumper。 對比mysqldump,mydumper具有如下特點: 1. 多線程備份 2. 備份執行 ...


生產環境中有一實例每天使用mysqldump備份時長達到了2個小時53分鐘,接近3個小時,還不算上備份文件歸檔的時間,這個時間對於邏輯備份來說有點久。為了提高邏輯備份效率,打算替換為使用mydumper。

對比mysqldump,mydumper具有如下特點:

  1. 多線程備份
  2. 備份執行速度更快
  3. 支持備份文件壓縮
  4. 支持行級別切塊備份

更多關於mydumper的說明,可以查看官方GitHubhttps://github.com/maxbube/mydumper

安裝

之前在測試mydumper時有使用過早期版本,是通過編譯進行安裝的,而mydumper是C語言寫的,編譯過程中出現了一系列的依賴問題。為了避免出現安裝依賴問題,官方從0.9.3版本開始提供了編譯後的安裝包,建議採用RPM包的方式進行安裝。同樣通過官方GitHub獲取安裝包。

本文使用的RPM安裝包為:

mydumper-0.9.5-2.el7.x86_64.rpm

安裝完成後驗證:

# rpm -qa |grep mydumper
mydumper-0.9.5-2.x86_64

# rpm -ql mydumper-0.9.5-2.x86_64
/usr/bin/mydumper
/usr/bin/myloader

mydumper:用來備份數據。
myloader:用來還原數據。

本文主要討論mydumper,查看版本信息:

# mydumper -V
mydumper 0.9.5, built against MySQL 5.7.21-21

主要選項

# mydumper --help
Usage:
  mydumper [OPTION?] multi-threaded MySQL dumping

Help Options:
  -?, --help                  Show help options

Application Options:
  -B, --database              Database to dump
  -T, --tables-list           Comma delimited table list to dump (does not exclude regex option)
  -O, --omit-from-file        File containing a list of database.table entries to skip, one per line (skips before applying regex option)
  -o, --outputdir             Directory to output files to
  -s, --statement-size        Attempted size of INSERT statement in bytes, default 1000000
  -r, --rows                  Try to split tables into chunks of this many rows. This option turns off --chunk-filesize
  -F, --chunk-filesize        Split tables into chunks of this output file size. This value is in MB
  -c, --compress              Compress output files
  -e, --build-empty-files     Build dump files even if no data available from table
  -x, --regex                 Regular expression for 'db.table' matching
  -i, --ignore-engines        Comma delimited list of storage engines to ignore
  -N, --insert-ignore         Dump rows with INSERT IGNORE
  -m, --no-schemas            Do not dump table schemas with the data
  -d, --no-data               Do not dump table data
  -G, --triggers              Dump triggers
  -E, --events                Dump events
  -R, --routines              Dump stored procedures and functions
  -W, --no-views              Do not dump VIEWs
  -k, --no-locks              Do not execute the temporary shared read lock.  WARNING: This will cause inconsistent backups
  --no-backup-locks           Do not use Percona backup locks
  --less-locking              Minimize locking time on InnoDB tables.
  -l, --long-query-guard      Set long query timer in seconds, default 60
  -K, --kill-long-queries     Kill long running queries (instead of aborting)
  -D, --daemon                Enable daemon mode
  -I, --snapshot-interval     Interval between each dump snapshot (in minutes), requires --daemon, default 60
  -L, --logfile               Log file name to use, by default stdout is used
  --tz-utc                    SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones, defaults to on use --skip-tz-utc to disable.
  --skip-tz-utc
  --use-savepoints            Use savepoints to reduce metadata locking issues, needs SUPER privilege
  --success-on-1146           Not increment error count and Warning instead of Critical in case of table doesn't exist
  --lock-all-tables           Use LOCK TABLE for all, instead of FTWRL
  -U, --updated-since         Use Update_time to dump only tables updated in the last U days
  --trx-consistency-only      Transactional consistency only
  --complete-insert           Use complete INSERT statements that include column names
  -h, --host                  The host to connect to
  -u, --user                  Username with the necessary privileges
  -p, --password              User password
  -a, --ask-password          Prompt For User password
  -P, --port                  TCP/IP port to connect to
  -S, --socket                UNIX domain socket file to use for connection
  -t, --threads               Number of threads to use, default 4
  -C, --compress-protocol     Use compression on the MySQL connection
  -V, --version               Show the program version and exit
  -v, --verbose               Verbosity of output, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
  --defaults-file             Use a specific defaults file
  --ssl                       Connect using SSL
  --key                       The path name to the key file
  --cert                      The path name to the certificate file
  --ca                        The path name to the certificate authority file
  --capath                    The path name to a directory that contains trusted SSL CA certificates in PEM format
  --cipher                    A list of permissible ciphers to use for SSL encryption

  • -B, --database
    指定dump資料庫

  • -T, --tables-list
    指定dump表,多個表用逗號分隔(不排除正則匹配)

  • -O, --omit-from-file
    指定dump需要跳過包含一行或多行database.table格式的文件,跳過dump的優先順序大於dump正則匹配

  • -o, --outputdir
    指定dump文件保存目錄

  • -s, --statement-size
    指定dump生成insert語句的大小,單位位元組,預設是1000000

  • -r, --rows
    把表多少行分割成chunks,這個選項會關閉選項 --chunk-filesize

  • -F, --chunk-filesize
    表分割成chunks的大小,單位為MB,這個指定大小預設為加1MB,如果想切割成每個3MB大小的文件,則指定 -F 2,如果指定 -F 1,則不進行切割,不清楚為什麼這麼設置

  • -c, --compress
    壓縮輸出文件

  • -e, --build-empty-files
    表中如果沒有數據也創建dump文件

  • -x, --regex
    正則匹配,如'db.table'

  • -i, --ignore-engines
    忽略存儲引擎,如有多個用逗號分隔

  • -N, --insert-ignore
    dump文件中不使用INSERT語句

  • -m, --no-schemas
    dump文件中只有表數據而沒有表結構信息

  • -d, --no-data
    dump文件中只有表結構而沒有表數據

  • -G, --triggers
    dump觸發器

  • -E, --events
    dump事件

  • -R, --routines
    dump存儲過程和函數

  • -W, --no-views
    不要dump視圖

  • -k, --no-locks
    不執行臨時的共用讀鎖,這有可能會導致不一致的備份

  • --no-backup-locks
    不使用Percona備份鎖

  • --less-locking
    最小化對InnoDB表的鎖定時間

  • -l, --long-query-guard
    設置長查詢的時間, 單位秒,預設60秒

  • -K, --kill-long-queries
    Kill長時間執行的查詢 (instead of aborting)

  • -D, --daemon
    指定為守護進程模式

  • -I, --snapshot-interval
    每次dump的快照間隔,單位分鐘, 需要開啟 --daemon,預設60分鐘

  • -L, --logfile
    指定輸出日誌文件名,預設為屏幕標準輸出

  • --tz-utc
    在dump一開始加入時區timestamp,數據移動或恢復至不同時區上的資料庫適用,預設通過選項 --skip-tz-utc 來禁用

  • --skip-tz-utc
    用法如上

  • --use-savepoints
    通過使用savepoints來避免元數據鎖的產生,需要SUPER許可權

  • --success-on-1146
    不統計增量錯誤和警告,除非是表不存在的錯誤

  • --lock-all-tables
    使用LOCK TABLE鎖定所有表,代替FTWRL

  • -U, --updated-since
    指定Update_time天數來dump只在過去幾天內更新的表

  • --trx-consistency-only
    事務一致性備份導出

  • --complete-insert
    dump文件中包含完整的INSERT語句,語句中包含所有欄位的名稱

  • -h, --host
    指定連接host

  • -u, --user
    指定連接用戶,需有相應的許可權

  • -p, --password
    指定用戶密碼

  • -a, --ask-password
    指定用戶密碼提示輸入

  • -P, --port
    指定連接port

  • -S, --socket
    指定本地socket文件連接

  • -t, --threads
    指定dump線程數, 預設是4

  • -C, --compress-protocol
    在mysql連接時使用壓縮協議

  • -V, --version
    顯示程式版本並退出

  • -v, --verbose
    顯示更詳細的輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 預設是2

  • --defaults-file
    指定預設參數文件

  • --ssl
    使用SSL連接

  • --key
    指定key file的文件路徑

  • --cert
    指定證書文件路徑

  • --ca
    指定證書授權文件路徑

  • --capath
    指定所有CA頒發的PEM格式文件路徑

  • --cipher
    指定允許使用SSL連接加密的密碼列表

備份流程

測試MySQL版本為官方社區版5.7.24

(root@localhost) [test] > select version();
+------------+
| version()  |
+------------+
| 5.7.24-log |
+------------+
1 row in set (0.00 sec)

通過開啟mysql的general log觀察下mydumper在備份過程中做了哪些操作。

  • 開啟general log
(root@localhost) [(none)] > show global variables like '%general%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | OFF                             |
| general_log_file | /data/mysql/3306/data/dbabd.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)

(root@localhost) [(none)] > set global general_log = 1;
Query OK, 0 rows affected (0.00 sec)

(root@localhost) [(none)] > show global variables like '%general%';
+------------------+---------------------------------+
| Variable_name    | Value                           |
+------------------+---------------------------------+
| general_log      | ON                              |
| general_log_file | /data/mysql/3306/data/dbabd.log |
+------------------+---------------------------------+
2 rows in set (0.01 sec)

  • 備份test庫
# mydumper -h 192.168.58.3 -u root -a -P 3306 -B test -o /data/test/

備份文件結構(以test.t1表為例):

# ll /data/test/
total 66728
-rw-r--r--. 1 root root      136 Dec 27 16:02 metadata
-rw-r--r--. 1 root root       63 Dec 27 16:02 test-schema-create.sql
-rw-r--r--. 1 root root      278 Dec 27 16:02 test.t1-schema.sql
-rw-r--r--. 1 root root 18390048 Dec 27 16:02 test.t1.sql

通過以上信息可知,備份所有文件都存放在一個目錄當中,可以指定。如果沒有指定路徑,則在運行mydumper命令的當前目錄下,生成一個新的目錄,名稱命名規則為:export-yyyymmdd-HHMMSS 。每個備份目錄中主要產生的備份文件為:

  • metadata文件

metadata:備份元數據信息。包含備份開始和備份結束時間,以及MASTER LOG FILEMASTER LOG POS。如果是在從庫進行備份,則記錄的是 SHOW SLAVE STATUS 中同步到的主庫binlog文件及binlog位置。

# cat metadata
Started dump at: 2018-12-27 16:02:06
SHOW MASTER STATUS:
        Log: mysql-bin.000034
        Pos: 154
        GTID:

Finished dump at: 2018-12-27 16:02:35
  • 庫創建語句文件

test-schema-create.sql:test庫的創建語句。

# cat test-schema-create.sql
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
  • 每張表兩個備份文件

test.t1-schema.sql:t1表的創建語句。

test.t1.sql:t1表數據文件,以INSERT語句存儲。

如果涉及到大表進行表切片備份的話,會有多個表數據文件。

  • 查看general log
-- 主線程連接資料庫,設置臨時session級別參數
 7   Connect   admin@dbabd on test using TCP/IP
 7   Query     SET SESSION wait_timeout = 2147483
 7   Query     SET SESSION net_write_timeout = 2147483
 7   Query     SHOW PROCESSLIST

-- 主線程執行FTWRL獲取全局讀鎖,並開啟一致性快照事務,記錄當前binlog文件及位置
 7   Query     FLUSH TABLES WITH READ LOCK
 7   Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
 7   Query     /*!40101 SET NAMES binary*/
 7   Query     SHOW MASTER STATUS
 7   Query     SHOW SLAVE STATUS

-- 產生了4個子進程,並且設置會話級事務隔離級別為REPEATABLE READ,4個子線程同時進行dump操作
 8   Connect   admin@dbabd on  using TCP/IP
 8   Query     SET SESSION wait_timeout = 2147483
 8   Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
 8   Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
 8   Query     /*!40103 SET TIME_ZONE='+00:00' */
 8   Query     /*!40101 SET NAMES binary*/

 9   Connect   admin@dbabd on  using TCP/IP
 9   Query     SET SESSION wait_timeout = 2147483
 9   Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
 9   Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
 9   Query     /*!40103 SET TIME_ZONE='+00:00' */
 9   Query     /*!40101 SET NAMES binary*/

10   Connect   admin@dbabd on  using TCP/IP
10   Query     SET SESSION wait_timeout = 2147483
10   Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
10   Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
10   Query     /*!40103 SET TIME_ZONE='+00:00' */
10   Query     /*!40101 SET NAMES binary*/

11   Connect   admin@dbabd on  using TCP/IP
11   Query     SET SESSION wait_timeout = 2147483
11   Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
11   Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
11   Query     /*!40103 SET TIME_ZONE='+00:00' */
11   Query     /*!40101 SET NAMES binary*/

-- 主線程獲取備份庫語句和表狀態 
 7   Init DB   test
 7   Query     SHOW TABLE STATUS
 7   Query     SHOW CREATE DATABASE `test`

-- 4個子進程備份庫中所有的表
 8   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='course' and extra like '%GENERATED%'
11   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='t' and extra like '%GENERATED%'
10   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='t2' and extra like '%GENERATED%'
 9   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='t1' and extra like '%GENERATED%'
 8   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`course`
 7   Query     UNLOCK TABLES /* FTWRL */
 7   Quit
11   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`t`
 9   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`t1`
10   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`t2`
11   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='t3' and extra like '%GENERATED%'
11   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`t3`
11   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='teacher' and extra like '%GENERATED%'
11   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`teacher`
 8   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='teachercard' and extra like '%GENERATED%'
 8   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`teachercard`
 8   Query     SHOW CREATE TABLE `test`.`course`
 8   Query     SHOW CREATE TABLE `test`.`t`
 8   Query     SHOW CREATE TABLE `test`.`t1`
 8   Query     SHOW CREATE TABLE `test`.`t2`
 8   Query     SHOW CREATE TABLE `test`.`t3`
 8   Query     SHOW CREATE TABLE `test`.`teacher`
 8   Query     SHOW CREATE TABLE `test`.`teachercard`
 8   Query     SHOW CREATE TABLE `test`.`v9_pic_tag_content`
11   Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='test' and TABLE_NAME='v9_pic_tag_content' and extra like '%GENERATED%'
 8   Quit
11   Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `test`.`v9_pic_tag_content`
 9   Quit
10   Quit
11   Quit  

總結下mydumper的工作流程:

  • 主線程連接MySQL,查詢當前服務線程狀態確定是否中止dump或是KILL長查詢;
  • 通過FTWRL獲取全局讀鎖,確保dump一致性,開啟一致性快照事務,查詢當前binlog信息寫入metadata文件;
  • 創建多個子線程(預設4個),開啟一致性快照事務,將session級事務隔離級別設置成REPEATABLE READ;
  • 子線程備份非事務引擎表(non-InnoDB tables);
  • 待子線程備份完非事務引擎表後,主線程執行UNLOCK TABLES釋放全局讀鎖;
  • 子線程備份事務引擎表(InnoDB tables);
  • (如有)子線程備份函數、存儲過程、觸發器和視圖;
  • dump過程結束。

用法示例

  • 備份全庫

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -o /data/backupdir
    
  • 備份某個庫

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -o /data/test/
    
  • 備份多個庫(可使用正則匹配)

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -x '^(test\.|test2\.)' -o /data/
    
  • 不備份某(幾)個庫

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -x '^(?!(mysql\.|sys\.))' -o /data/
    
  • 備份某(幾)張表

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -T test.t1,test2.t3 -o /data/
    
  • 不備份某(幾)張表

    通過正則匹配

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -x '^(?!test.t2)' -o /data/test/ 
    

    通過選項 -O, --omit-from-file

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -O nodump.file -o /data/test/
    
  • 切割表數據文件,指定每份文件包含行數

    test.t2表有100萬行:

    (root@localhost) [test] > select count(*) from t2;
    +----------+
    | count(*) |
    +----------+
    |  1000000 |
    +----------+
    1 row in set (0.45 sec)
    

    現在指定備份test.t2表分割成每個chunks包含的行數為10萬行:

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -T test.t2 -r 100000 -o /data/test/
    

    查看表備份文件:

    # ls /data/test/
    metadata           test.t2.00001.sql  test.t2.00003.sql  test.t2.00005.sql  test.t2.00007.sql  test.t2.00009.sql
    test.t2.00000.sql  test.t2.00002.sql  test.t2.00004.sql  test.t2.00006.sql  test.t2.00008.sql  test.t2-schema.sql
    
  • 切割表數據文件,指定每份文件大小

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -T test.t2 -F 2 -o /data/test/
    

    查看表備份文件:

    # ll -h /data/test/
    total 18M
    -rw-r--r--. 1 root root  141 Dec 27 16:32 metadata
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00001.sql
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00002.sql
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00003.sql
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00004.sql
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00005.sql
    -rw-r--r--. 1 root root 2.9M Dec 27 16:32 test.t2.00006.sql
    -rw-r--r--. 1 root root 381K Dec 27 16:32 test.t2.00007.sql
    -rw-r--r--. 1 root root  278 Dec 27 16:32 test.t2-schema.sql
    
  • 對備份文件進行壓縮

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -c -o /data/test/
    

    沒壓縮之前的大小:

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -o /data/test/
    
    # du /data/test  --max-depth=1 -h
    53M     /data/test
    

    壓縮之後的大小:

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -c -o /data/test/
    
    # du /data/test/  --max-depth=1 -h
    22M     /data/test/
    
  • 對空表備份也生成數據文件

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -e -o /data/test/
    

    這樣即使是張空表,不僅備份會生成table-schema.sql文件,也會生成table.sql文件。

  • 指定備份子線程數

    # mydumper -h 192.168.58.3 -u admin -a -P 3306 -B test -e -t 8 -o /data/test/
    

    沒指定 -t 選項預設是4個子線程,可以根據機器配置進行適當增加子線程數加快備份效率。

參考

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

作者: H_Johnny 出處: http://www.cnblogs.com/dbabd/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。 如果您覺得文章不錯,請幫忙點擊右下角的推薦,謝謝!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝依賴 mysql 5.6.40二進位包下載地址 1.下載MySQL 5.6.40二進位包 2.解壓縮mysql二進位包到/usr/local 3.修改名稱、做軟連接 4.創建mysql用戶和組 //創建mysql組 //創建mysql用戶 5.拷貝主配置文件 //備份/etc/my.cnf // ...
  • 在這裡我就不說怎麼搭建 Mysql 資料庫了!如果有需要可以參照我前面的博文。 此博文主要說配置 Linux 資料庫 主從 下麵我們開始進入正題。 master:192.168.31.200 slave:192.168.31.250 主:192.168.31.200 配置如下: 1.修改 /etc/ ...
  • 索引小知識 篇幅有限,索引的基本知識我們就不贅述了,在此,我們嘗試說明其中的一個小點 B+樹與B樹的區別到底是什麼。 InnoDB是使用B+樹來實現其索引功能的。在B+樹中,內節點(非葉子節點)存儲了行數據的鍵,而葉子節點存儲了所有的行數據,而B樹的每個節點都存儲了真實的數據。這種數據結構,決定了兩 ...
  • 在PostgreSQL官方文檔:https://www.postgresql.org/download/linux/redhat/ 有選項和說明 1、檢查有沒安裝:rpg -ga | grep postgresql 2、下載 從上述網址得到YUM地址,即在終端輸入:yum install https ...
  • rocksdb(https://rocksdb.org.cn/)是臉書(facebook)公司開源的一個key-value存儲引擎,基於leveldb開發。rocksdb使用的是LSM存儲引擎,純c++編寫。rocksdb具有很好的讀寫性能。但是rocksdb的實際操作需要很好的閱讀rocksdb ...
  • 非select命令 資料庫 1.創建 //create database 庫名 2.刪除 //drop database 庫名,... 2.重命名//exec sp_renamedb '庫名','新庫名' 表 1.創建 //create table 表名 (列名 類型,...) 2.刪除 //dro ...
  • --聲明變數,同時為變數賦值 declare @n int=10 print @n --單獨使用一條語句為變數複製 set @n=20 print @n select @n=30 print @n --通過set賦值與select複製的區別 select @n=COUNT(*) from Emplo... ...
  • 1、MongoDB介紹 1.1 什麼是MongoDB ? MongoDB 是由C++語言編寫的,是一個基於分散式文件存儲的開源資料庫系統。 在高負載的情況下,添加更多的節點,可以保證伺服器性能。 MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 MongoDB 將數據存儲為一個文 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...