技術分享 | MySQL 閃回工具 MyFlash|mysql|session|query|server...

2021-01-08 網易

  

作者:陳怡
愛可生南分團隊 DBA,負責公司自動化運維平臺維護和處理客戶問題。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
前言

  MyFlash 是美團點評開源的一個 MySQL 閃回工具,可以用來回滾 MySQL 中的 DML 操作,恢復到某時刻的數據。本文將簡單地介紹 MySQL 閃回工具 MyFlash 的使用。

限制

  MyFlash 工具存在如下限制:

  

下載安裝

  下載 MyFlash 安裝包,將安裝包安裝於 /data 目錄下,編譯之前,先安裝依賴包。

  [root@10-186-62-22 ~ ]# cd /data

  [root@10-186-62-22 data]# wget https://github.com/Meituan-Dianping/MyFlash/archive/master.zip

  [root@10-186-62-22 data]# unzip master.zip

  Archive: master.zip

  b128c0faaf1a657d09238b7cda1c2a80ad599909

  creating: MyFlash-master/

  extracting: MyFlash-master/.gitignore

  inflating: MyFlash-master/License.md

  inflating: MyFlash-master/README.md

  creating: MyFlash-master/binary/

  inflating: MyFlash-master/binary/flashback

  inflating: MyFlash-master/binary/mysqlbinlog20160408

  inflating: MyFlash-master/binlog_output_base.flashback

  inflating: MyFlash-master/build.sh

  creating: MyFlash-master/doc/

  extracting: MyFlash-master/doc/FAQ.md

  extracting: MyFlash-master/doc/Function.md

  inflating: MyFlash-master/doc/INSTALL.md

  inflating: MyFlash-master/doc/TestCase.md

  inflating: MyFlash-master/doc/how_to_use.md

  creating: MyFlash-master/source/

  inflating: MyFlash-master/source/binlogParseGlib.c

  creating: MyFlash-master/source/mysqlHelper/

  extracting: MyFlash-master/source/mysqlHelper/mysqlHelper.c

  creating: MyFlash-master/source/network/

  inflating: MyFlash-master/source/network/network.c

  creating: MyFlash-master/testbinlog/

  inflating: MyFlash-master/testbinlog/haha.000005

  inflating: MyFlash-master/testbinlog/haha.000007

  inflating: MyFlash-master/testbinlog/haha.000008

  inflating: MyFlash-master/testbinlog/haha.000009

  inflating: MyFlash-master/testbinlog/haha.000041

  [root@10-186-62-22 data]# mv MyFlash-master MyFlash

  [root@10-186-62-22 data]# cd MyFlash/

  [root@10-186-62-22 MyFlash]# yum install gcc glib2-devel -y

  [root@10-186-62-22 MyFlash]# gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback

用法

  flashback [OPTION...]

  常用參數說明:

  --databaseNames

  指定需要回滾的資料庫名。多個資料庫可以用 「,」 隔開。如果不指定該參數,相當於指定了所有資料庫。

  --tableNames

  指定需要回滾的表名。多個表可以用 「,」 隔開。如果不指定該參數,相當於指定了所有表。

  --start-position

  指定回滾開始的位置。如不指定,從文件的開始處回滾。請指定正確的有效的位置,否則無法回滾。

  --stop-position

  指定回滾結束的位置。如不指定,回滾到文件結尾。請指定正確的有效的位置,否則無法回滾。

  --start-datetime

  指定回滾的開始時間。注意格式必須是 %Y-%m-%d %H:%M:%S。如不指定,則不限定時間。

  --stop-datetime

  指定回滾的結束時間。注意格式必須是 %Y-%m-%d %H:%M:%S。如不指定,則不限定時間。

  --sqlTypes

  指定需要回滾的 sql 類型。目前支持的過濾類型是 INSERT, UPDATE, DELETE。多個類型可以用 「,」 隔開。

  --maxSplitSize

  指定解析分割後文件最大大小,單位為 M。--binlogFileNames指定需要回滾的 binlog 文件,如有多個,用 「,」 隔開。

  --outBinlogFileNameBase

  指定輸出的 binlog 文件前綴,如不指定,則默認為 binlog_output_base.flashback。

  --logLevel

  指定輸出的日誌級別,可選級別有 debug, warning, error,默認級別為 error 級別。

  --include-gtids

  指定需要回滾的 gtid,支持 gtid 的單個和範圍兩種形式,如有多種形式,用 「,」 隔開。

  --exclude-gtids

  指定不需要回滾的 gtid,支持 gtid 的單個和範圍兩種形式,如有多種形式,用 「,」 隔開。

測試用例

  模擬在一個實例中,對 d1.t1 進行了 update 操作和 delete 操作,需要回滾 update 和 delete 操作場景。

  原 d1.t1 表中數據如下:

  mysql> select * from d1.t1;

  +-+

  | id |

  +-+

  | 1 |

  | 2 |

  | 3 |

  | 4 |

  | 5 |

  | 6 |

  | 7 |

  | 8 |

  | 9 |

  | 10 |

  +-+

  10 rows in set (0.00 sec)

  mysql> checksum table d1.t1;

  +--+--+

  | Table | Checksum |

  +--+--+

  | d1.t1 | 1635096377 |

  +--+--+

  1 row in set (0.00 sec)

  進行了 update 和 delete 操作:

  mysql> update d1.t1 set id=id+10 where id<6;

  Query OK, 5 rows affected (0.01 sec)

  Rows matched: 5 Changed: 5 Warnings: 0

  
mysql> select * from d1.t1;

  +-+

  | id |

  +-+

  | 11 |

  | 12 |

  | 13 |

  | 14 |

  | 15 |

  | 6 |

  | 7 |

  | 8 |

  | 9 |

  | 10 |

  +-+

  10 rows in set (0.00 sec)

  
mysql> checksum table d1.t1;

  +--+--+

  | Table | Checksum |

  +--+--+

  | d1.t1 | 1061066609 |

  +--+--+

  1 row in set (0.00 sec)

  
mysql> delete from d1.t1 where id<10;

  Query OK, 4 rows affected (0.00 sec)

  
mysql> select * from d1.t1;

  +-+

  | id |

  +-+

  | 11 |

  | 12 |

  | 13 |

  | 14 |

  | 15 |

  | 10 |

  +-+

  6 rows in set (0.00 sec)

  
mysql> checksum table d1.t1;

  +--+--+

  | Table | Checksum |

  +--+--+

  | d1.t1 | 1094682723 |

  +--+--+

  1 row in set (0.00 sec)

  此時,期望回滾 update 和 delete 操作。先 flush binlog,切換 binlog 文件:

  mysql> flush logs;

  Query OK, 0 rows affected (0.07 sec)

  解析 binlog,查看對應 update 和 delete 操作,在 17:22:30 時進行 update 操作,在 17:23:35 時已經完成了delete 操作。

  [root@10-186-62-22 3308]# mysqlbinlog -vv mysql-bin.000001 |less

  #201129 17:22:30 server id 313253419 end_log_pos 450327 CRC32 0x23bf37dd Query thread_id=108971 exec_time=0 error_code=0

  SET TIMESTAMP=1606670550/*!*/;

  BEGIN

  /*!*/;

  # at 450327

  #201129 17:22:30 server id 313253419 end_log_pos 450387 CRC32 0xe368ad04 Rows_query

  # update d1.t1 set id=id+10 where id<6

  # at 450387

  #201129 17:22:30 server id 313253419 end_log_pos 450430 CRC32 0x3b1221e2 Table_map: `d1`.`t1` mapped to number 223# at 450430

  #201129 17:22:30 server id 313253419 end_log_pos 450516 CRC32 0x484dc736 Update_rows: table id 223 flags: STMT_END_F
BINLOG '

  1tjDXx0r3qsSPAAAAFPfBgCAACR1cGRhdGUgZDEudDEgc2V0IGlkPWlkKzEwIHdoZXJlIGlkPDYE

  rWjj

  1tjDXxMr3qsSKwAAAH7fBgAAAN8AAAAAAAEAAmQxAAJ0MQABAwAB4iESOw==

  1tjDXx8r3qsSVgAAANTfBgAAAN8AAAAAAAEAAgAB///+AQAAAP4LAAAA/gIAAAD+DAAAAP4DAAAA

  /g0AAAD+BAAAAP4OAAAA/gUAAAD+DwAAADbHTUg=

  '/*!*/;

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=1 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=11 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=2 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=12 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=3 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=13 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=4 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=14 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=5 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=15 /* INT meta=0 nullable=1 is_null=0 */

  # at 450516

  #201129 17:22:30 server id 313253419 end_log_pos 450547 CRC32 0x4905fbcf Xid = 33117376

  COMMIT/*!*/;

  # at 450547

  #201129 17:23:09 server id 313253419 end_log_pos 450682 CRC32 0xb993ef68 Query thread_id=108971 exec_time=0 error_code=0

  SET TIMESTAMP=1606670589/*!*/;

  BEGIN/*!*/;

  # at 450682

  #201129 17:23:09 server id 313253419 end_log_pos 450735 CRC32 0x767343ad Rows_query# delete from d1.t1 where id<10

  # at 450735

  #201129 17:23:09 server id 313253419 end_log_pos 450778 CRC32 0x6bd9dc7b Table_map: `d1`.`t1` mapped to number 223

  # at 450778

  #201129 17:23:09 server id 313253419 end_log_pos 450833 CRC32 0x1ba9f05c Delete_rows: table id 223 flags: STMT_END_F
BINLOG '

  /djDXx0r3qsSNQAAAK/gBgCAAB1kZWxldGUgZnJvbSBkMS50MSB3aGVyZSBpZDwxMK1Dc3Y=

  /djDXxMr3qsSKwAAANrgBgAAAN8AAAAAAAEAAmQxAAJ0MQABAwABe9zZaw==

  /djDXyAr3qsSNwAAABHhBgAAAN8AAAAAAAEAAgAB//4GAAAA/gcAAAD+CAAAAP4JAAAAXPCpGw==

  '/*!*/;

  ### DELETE FROM `d1`.`t1`

  ### WHERE

  ### @1=6 /* INT meta=0 nullable=1 is_null=0 */

  ### DELETE FROM `d1`.`t1`

  ### WHERE

  ### @1=7 /* INT meta=0 nullable=1 is_null=0 */

  ### DELETE FROM `d1`.`t1`

  ### WHERE

  ### @1=8 /* INT meta=0 nullable=1 is_null=0 */

  ### DELETE FROM `d1`.`t1`

  ### WHERE

  ### @1=9 /* INT meta=0 nullable=1 is_null=0 */

  # at 450833

  #201129 17:23:09 server id 313253419 end_log_pos 450864 CRC32 0x8c6244ec Xid = 33117815COMMIT/*!*/;

  # at 450864

  #201129 17:23:35 server id 313253419 end_log_pos 450929 CRC32 0x6191c83b GTID [commit=no]

  SET @@SESSION.GTID_NEXT= '36edb64b-17fa-11eb-a621-02000aba3e16:1028'/*!*/;

  使用 MyFlash 工具進行回滾,進入到工具的安裝目錄,執行命令反向解析 binlog,指定要回滾的庫、表、開始時間和結束時間,並指定反向解析的 SQL 語句類型:

  [root@10-186-62-22 MyFlash]# ./binary/flashback --databaseNames="d1" --tableNames="t1" --start-datetime="2020-11-29 17:22:30" --stop-datetime="2020-11-29 17:24:30" --sqlTypes="UPDATE,DELETE" --binlogFileNames=/opt/mysql/log/binlog/3308/mysql-bin.000001 --outBinlogFileNameBase=test.sql

  查看到反向解析後的 binlog 文件,執行順序為先回滾 delete 操作,將被刪除的數據添加,再逆向 update 語句。

  [root@10-186-62-22 MyFlash]# mysqlbinlog -vv test.sql.flashback

  /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

  /*!40019 SET @@session.max_insert_delayed_threads=0*/;

  /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

  DELIMITER /*!*/;

  # at 4

  #201027 10:15:00 server id 313253419 end_log_pos 123 CRC32 0x500482f7 Start: binlog v 4, server v 5.7.25-log created 201027 10:15:00 at startup

  # Warning: this binlog is either in use or was not closed properly.

  ROLLBACK/*!*/;

  BINLOG '

  pIKXXw8r3qsSdwAAAHsAAAABAAQANS43LjI1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

  AAAAAAAAAAAAAAAAAACkgpdfEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA

  AfeCBFA=

  '/*!*/;

  # at 123

  #201129 17:23:09 server id 313253419 end_log_pos 166 CRC32 0x6bd9dc7b Table_map: `d1`.`t1` mapped to number 223# at 166

  #201129 17:23:09 server id 313253419 end_log_pos 221 CRC32 0x1ba9f05c Write_rows: table id 223 flags: STMT_END_F
BINLOG '

  /djDXxMr3qsSKwAAAKYAAAAAAN8AAAAAAAEAAmQxAAJ0MQABAwABe9zZaw==

  /djDXx4r3qsSNwAAAN0AAAAAAN8AAAAAAAEAAgAB//4GAAAA/gcAAAD+CAAAAP4JAAAAXPCpGw==

  '/*!*/;

  ### INSERT INTO `d1`.`t1`

  ### SET

  ### @1=6 /* INT meta=0 nullable=1 is_null=0 */

  ### INSERT INTO `d1`.`t1`

  ### SET

  ### @1=7 /* INT meta=0 nullable=1 is_null=0 */

  ### INSERT INTO `d1`.`t1`

  ### SET

  ### @1=8 /* INT meta=0 nullable=1 is_null=0 */

  ### INSERT INTO `d1`.`t1`

  ### SET

  ### @1=9 /* INT meta=0 nullable=1 is_null=0 */

  # at 221

  #201129 17:38:00 server id 313253419 end_log_pos 252 CRC32 0xf267b63c Xid = 33082944

  COMMIT/*!*/;

  # at 252

  #201129 17:22:30 server id 313253419 end_log_pos 295 CRC32 0x3b1221e2 Table_map: `d1`.`t1` mapped to number 223

  # at 295

  #201129 17:22:30 server id 313253419 end_log_pos 381 CRC32 0x484dc736 Update_rows: table id 223 flags: STMT_END_F

  
BINLOG '

  1tjDXxMr3qsSKwAAACcBAAAAAN8AAAAAAAEAAmQxAAJ0MQABAwAB4iESOw==

  1tjDXx8r3qsSVgAAAH0BAAAAAN8AAAAAAAEAAgAB///+CwAAAP4BAAAA/gwAAAD+AgAAAP4NAAAA

  /gMAAAD+DgAAAP4EAAAA/g8AAAD+BQAAADbHTUg=

  '/*!*/;

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=11 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=1 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=12 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=2 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=13 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=3 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=14 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=4 /* INT meta=0 nullable=1 is_null=0 */

  ### UPDATE `d1`.`t1`

  ### WHERE

  ### @1=15 /* INT meta=0 nullable=1 is_null=0 */

  ### SET

  ### @1=5 /* INT meta=0 nullable=1 is_null=0 */

  # at 381

  #201129 17:38:00 server id 313253419 end_log_pos 412 CRC32 0xf267b63c Xid = 33082944

  COMMIT/*!*/;

  DELIMITER ;

  # End of log file

  ROLLBACK /* added by mysqlbinlog */;

  /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

  /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

  將反向解析的 binlog 文件語句回放到資料庫中。由於所測試的實例中已經開啟 gtid 模式,而反向解析出來的 binlog 文件中沒有定義 SESSION.GTID_NEXT cannot be set to ANONYMOUS when SESSION.GTID_NEXT='AUTOMATIC' ,這樣就可以回放成功了。

  [root@10-186-62-22 MyFlash]# mysqlbinlog test.sql.flashback | mysql -S /tmp/mysqld.sock -uroot -proot

  mysql: [Warning] Using a password on the command line interface can be insecure.

  ERROR 1782 (HY000) at line 19: GLOBAL.GTID_MODE = ON.

  [root@10-186-62-22 MyFlash]#

  [root@10-186-62-22 MyFlash]# mysqlbinlog --skip-gtids test.sql.flashback | mysql -S /tmp/mysqld.sock -uroot -proot

  mysql: [Warning] Using a password on the command line interface can be insecure.

  驗證數據,數據已經恢復到 update 操作之前,完成回滾操作。

  mysql> select * from d1.t1;

  +-+

  | id |

  +-+

  | 1 |

  | 2 |

  | 3 |

  | 4 |

  | 5 |

  | 10 |

  | 6 |

  | 7 |

  | 8 |

  | 9 |

  +-+

  10 rows in set (0.00 sec)

  
mysql> checksum table d1.t1;

  +--+--+

  | Table | Checksum |

  +--+--+

  | d1.t1 | 1635096377 |

  +--+--+

  1 row in set (0.00 sec)

  

https://github.com/Meituan-Dianping/MyFlash/blob/master/README.md

相關焦點

  • 技術分享 | MySQL 閃回工具 MyFlash
    前言  MyFlash 是美團點評開源的一個 MySQL 閃回工具,可以用來回滾 MySQL 中的 DML 操作,恢復到某時刻的數據。本文將簡單地介紹 MySQL 閃回工具 MyFlash 的使用。*/;  # at 450327  #201129 17:22:30 server id 313253419 end_log_pos 450387 CRC32 0xe368ad04 Rows_query  # update d1.t1 set id=id+10 where id<6  # at 450387
  • 美團點評開源 MySQL 極速閃回工具 MyFlash
    MyFlash 是由美團點評公司技術工程部開發維護且內部使用的一個回滾 DML 操作的工具,旨在方便且高效地進行數據恢復,已於近日宣布開源
  • 技術分享 | mysql show processlist Time 為負數的思考
    會設置為當前時間,那 Time 的計算公式 now - thdinfo->start_time 就等於 (伺服器當前時間 - 命令開始執行的時間)。如下:堆棧:query event:#0 THD::set_time (this=0x7ffe78000950, t=0x7ffe701ec430) at /root/mysqlall/percona-server-locks-detail-5.7.22/sql/sql_class.h:3526#1 0x00000000018459ab
  • 中間件mysql-proxy的一些細節
    mysql-proxy是官方提供的mysql中間件產品可以實現負載平衡,讀寫分離,failover等,但其不支持大數據量的分庫分表且性能較差。Atlas(是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。)今天推薦一篇文章,深度分享mysql-proxy的細節。
  • Python 資料庫騷操作 -- MySQL
    MySQL GUI 工具首先介紹一款 MySQL 的 GUI 工具 Navicat for MySQL,初學 MySQL 用這個來查看數據真的很爽。可以即時看到數據的增刪改查,不用操作命令行來查看。version: '3'services:  mysql_container:    image: mysql    ports:      - "3306:3306"    volumes:      - /usr/local/db/mysql:/var/lib/mysql#      - /root/docker/
  • 溯源反制之MySQL蜜罐研究
    amp;MySQLServer{ SessionModule: session.NewSessionModule("mysql.server", s), } mod.AddParam(session.NewStringParameter("mysql.server.infile", "/etc/passwd", "", "File you want to read
  • mysql show processlist Time為負數的思考
    1、執行命令如果主庫執行常見的命令都會在命令發起的時候調用重載1,設置start_time為命令開始執行的時間如下:堆棧:#0 THD::set_time (this=0x7ffe7c000c90) at /mysqldata/percona-server-locks-detail-5.7.22/sql
  • MySQL RR隔離級別死鎖分析一例
    「1,1」記錄的LOCK_REC_NOT_GAP|LOCK_X然後session 1做update 獲得唯一索引上的「1,1」記錄的 LOCK_ORDINARY(next key lock)|LOCK_Ssession 2需要獲取唯一索引上的"1,1"記錄的
  • 解密TenDB(MySQL) Flashback 實現(二):按記錄回滾實現
    單記錄過濾與閃回。庫表級閃回與記錄級閃回mysqlbinlog 庫表級 flashback 特性由同事 王翔 引入並實現。庫表級 flashback 實現:借鑑MariaDB Flashback實現思路,我們在TenDB3(MySQL 5.7)版本中實現了Flashback。
  • MySQL慢查詢記錄原理和內容解析
    下面是部分棧幀:#0 THD::set_time_after_lock (this=0x7fff28012820) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/sql_class.h:3414#1 0x0000000001760d6d in mysql_lock_tables (thd=0x7fff28012820
  • MySQL - percona-toolkit工具
    percona-toolkit是一組維護MySQL的高級工具集合。下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/工具分類開發類 pt-duplicate-key-checker 列出並刪除重複的索引和外鍵 pt-online-schema-change 在線修改表結構 pt-query-advisor 分析查詢語句
  • MySQL慢日誌簡介及Anemometer工具介紹 | | For DBA
    Anemometer 簡介項目地址:https://github.com/box/Anemometer演示地址:http://lab.fordba.com/anemometer/Anemometer 是一個圖形化顯示從MySQL慢日誌的工具。
  • MySQL 變量及性能狀態查看知識技巧
    現在大家對MySQL的監控通常有兩種做法,一是連接到mysql資料庫內部,使用show status,show variables,flush status 來查看mysql的各種性能指標;二是直接使用mysqladmin查看其性能指標。
  • MySQL環境配置和入門講解!
    _5.7.26-1ubuntu18.04_amd64.deb # 更新軟體源sudo apt-get upgrade安裝客戶端和環境的具體步驟:# 安裝mysql服務sudo apt-get install mysql-server# 安裝客戶端
  • MySQL innochecksum 工具
    MySQL innochecksum 工具主要用於MySQL innodb表空間文件的校驗,通過讀取表空間文件,計算頁的checksum值,將計算的結果與頁內存儲的checksum值進行對比,檢查對比結果是否一致,如果不一致,說明文件頁可能發生了損壞,innochecksum工具同時提供了checksum校驗值修復功能,能夠將頁checksum值不正確的頁進行修復。
  • MySQL環境配置和10分鐘快速入門
    _5.7.26-1ubuntu18.04_amd64.deb # 更新軟體源sudo apt-get upgrade安裝客戶端和環境的具體步驟:# 安裝mysql服務sudo apt-get install mysql-server# 安裝客戶端
  • 在mysql中如何刪除記錄?delete關鍵字了解一下
    在上一篇文章中我們學習了如何更新mysql中的數據內容,用到的是update這個關鍵字,今天我們要學習的是如何讓在mysql中刪除記錄,也就是從箱子裡面拿走東西,用到的關鍵字是delete這個關鍵字,下面我們就通過一個例子來了解一下。
  • MySQL優化:學會使用show profile和trace分析慢查詢
    >mysql> help profile;1.1 確定是否支持 profilemysql> select @@have_profiling;如果結果是YES表示支持。使用如下命令開啟:mysql> set profiling=1;1.3 執行要分析的sql語句mysql> select * from test_table where d=90000;執行完成SQL後再執行
  • 基於MySQL的高性能資料庫應用開發
    注意時間的格式 "'Test','MySQLTest',2000,3)"); if (mysql_query( myData, szSqlText)) {//執行SQL語句出錯 ErrLog( "Can't insert data to table") ; mysql_close( myData ) ; return FALSE ; }
  • MySQL 5.7基於GTID及多線程主從複製
    ⑤如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog,在讀取執行事務前會先檢查其他session持有該GTID,確保不被重複執行。⑥在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。