精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

mysqldump一致性熱備原理剖析

數據庫 MySQL
mysqldump是實際場景中最常使用的備份工具之一,通過選擇合適的選項做備份,mysqldump可以保證數據的一致性,同時盡可能保證進行中的業務不受影響。

 引言

在日常數據庫運維中,經常要對數據庫進行熱備。熱備的一個關鍵點是保證數據的一致性,即在備份進行時發生的數據更改,不會在備份結果中出現。mysqldump是實際場景中最常使用的備份工具之一,通過選擇合適的選項做備份,mysqldump可以保證數據的一致性,同時盡可能保證進行中的業務不受影響。

那么mysqldump是如何實現一致性備份的?以下我將結合mysqldump過程中mysqld生成的general log與mysqldump的源碼來解釋mysqldump一致性備份的原理。

注:以下的實例基于MySQL 8.0.18,在不同版本上mysqldump的部分實現會有不同

首先用mysqldump執行一次一致性備份: 

  1. $ mysqldump -uroot -p --skip-opt --default-character-set=utf8  --single-transaction --master-data=2 --no-autocommit -B d1> backup.sql 

關鍵參數解釋:

  •  --single-transaction:執行一致性備份。
  •  --master-data=2:要求dump結果中以注釋形式保存備份時的binlog位置信息。
  •  -B:指定要dump的數據庫,在這里d1是一個使用InnoDB作為存儲引擎的庫,其中只有一個表t1。

執行完成后可以得到mysqld生成的general log,里面記錄了mysqldump在備份過程中傳給server的指令。

其中關鍵的步驟我用框框作了標記,具體的解釋請看下文。

mysqldump一致性備份的主要執行流程

  1.  連接server
  2.  兩次關閉所有表,第二次關表同時加讀鎖
  3.  設置隔離級別為“可重復讀”,開始事務并創建快照
  4.  獲取當前binlog位置
  5.  解鎖所有表
  6.  對指定的庫與表進行dump

下面結合SQL內容與源碼對以上主要步驟進行依次介紹。

流程剖析

1. 連接server

mysqldump首先與server建立連接,并初始化session,set一些session級的變量,對應SQL如下圖

其在main函數中對應的源碼就是一個對connect_to_db函數的調用: 

  1. if (connect_to_db(current_host, current_user, opt_password)) {  
  2.   free_resources();  
  3.   exit(EX_MYSQLERR); 

2. 兩次關閉所有表,第二次關表同時加讀鎖

連接建立后,mysqldump緊接著執行兩次關表操作,并在第二次關表同時給所有表加上讀鎖,對應SQL如下圖:

這一部分在main函數中對應的源碼為: 

  1. if ((opt_lock_all_tables || opt_master_data ||  
  2.      (opt_single_transaction && flush_logs)) &&  
  3.     do_flush_tables_read_lock(mysql))  
  4.   goto err; 

可以看到實際操作由do_flush_tables_read_lock函數進行,但是這里需要注意操作執行的前提條件,觀察代碼我們可以知道,這個關表操作只會在三種情況下進行:

  1.  通過--lock-all-tables選項顯式要求給所有表加鎖。
  2.  通過--master-data選項要求dump出來的結果中包含binlog位置。
  3.  通過--single-transaction指定了進行單事務的一致性備份,同時通過--flush-logs要求刷新log文件。

看到這里不難知道,除了第一種情況顯式要求加鎖之外,情況3要求刷新log前沒有其他事務在進行寫操作,自然要對所有表加上讀鎖。情況2要求dump結果中準確記錄dump進行時刻的binlog位置,為了準確地得到當前binlog的位置,自然就需要給所有的表加共享鎖,防止其他并行事務進行寫操作導致binlog更新,因此這里才有一個關表、加讀鎖的動作。

這里有一個細節,我們知道--single-transaction選項可以執行一致性備份,那么在只有--single-transaction選項時為什么不需要進行關表與加讀鎖的動作呢?這是因為--single-transaction所保證的一致性備份依賴于支持事務的存儲引擎(如InnoDB),在后面會提到,mysqldump通過執行START TRANSACTION WITH CONSISTENT SNAPSHOT會創建一個數據庫當前的快照與一個事務id,所有在該事務之后的事務所進行的數據更新都會被過濾,以此來保證備份的一致性。這種方式的優勢在于不會在進行一致性備份時干擾其他事務的正常進行,實現了所謂的“熱備”,但是缺點在于其依賴事務型存儲引擎,對于使用MyISAM等不支持事務的存儲引擎的表,--single-transaction無法保證它們的數據一致性。

接著查看do_flush_tables_read_lock函數的源碼: 

  1. static int do_flush_tables_read_lock(MYSQL *mysql_con) {  
  2.  return (mysql_query_with_error_report(  
  3.              mysql_con, 0,  
  4.             ((opt_master_data != 0) ? "FLUSH /*!40101 LOCAL */ TABLES"  
  5.                                     : "FLUSH TABLES")) ||  
  6.          mysql_query_with_error_report(mysql_con, 0,  
  7.                                        "FLUSH TABLES WITH READ LOCK"));  

可以看到邏輯比較簡單,就是向server傳入執行兩個query,依先后次序分別時FLUSH TABLES和FLUSH TABLES WITH READ LOCK,這里核心的動作在于后面一個query,之所以需要前面的FLUSH TABLES是基于性能的考量,以盡可能減少加鎖對其他事務的影響。

3. 設置隔離級別為“可重復讀”,開始事務并創建快照

關表操作執行完后,mysqldump接著開啟一個新事務并創建快照,對應SQL如下圖:

這一部分在main函數中對應的源碼為: 

  1. if (opt_single_transaction && start_transaction(mysql)) goto err; 

可以看到,只有在指定--single-transaction選項時這一步驟才會執行。實際上這一步就是mysqldump實現一致性熱備的基礎,我們接著查看start_transaction函數的源碼:

 

  1. static int start_transaction(MYSQL *mysql_con) {  
  2.  // 省略部分非關鍵代碼與注釋  
  3.  return (  
  4.      mysql_query_with_error_report(mysql_con, 0,  
  5.                                    "SET SESSION TRANSACTION ISOLATION "  
  6.                                    "LEVEL REPEATABLE READ") ||  
  7.      mysql_query_with_error_report(mysql_con, 0,  
  8.                                    "START TRANSACTION "  
  9.                                    "/*!40100 WITH CONSISTENT SNAPSHOT */"));  

可以看到核心動作是傳給server執行的兩個query,先是SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ確保當前會話的隔離級別是“可重復讀”,然后通過START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */來開始一個新事務,產生一個新事務id,同時創建一個快照,dump過程中所使用的數據都基于這個快照。這樣,所有在該事務之后的事務所進行的數據更新都會被過濾,備份的數據一致性因此得以保證。

但是,這樣的熱備方法,依賴于像InnoDB這樣支持事務的存儲引擎。相反,如MyISAM這種不支持事務的存儲引擎在備份過程中的數據一致性則不能被保證。

4. 獲取當前binlog位置

隨后mysqldump執行一個SHOW MASTER STATUS的query,以獲取當前binlog的位置信息:

查看main函數中對應部分的源碼可以看到,只有在指定--master-data選項時才會去獲取、記錄當前的binlog位置: 

  1. if (opt_master_data && do_show_master_status(mysql)) goto err; 

查看do_show_master_status函數的實現,可以看到核心動作就是向server傳入執行一個SHOW MASTER STATUS的query,最后將得到的binlog位置信息寫入dump結果中。 

  1. static int do_show_master_status(MYSQL *mysql_con) {  
  2.   MYSQL_ROW row;  
  3.   MYSQL_RES *master;  
  4.   const char *comment_prefix =  
  5.       (opt_master_data == MYSQL_OPT_MASTER_DATA_COMMENTED_SQL) ? "-- " : "";  
  6.   if (mysql_query_with_error_report(mysql_con, &master, "SHOW MASTER STATUS")) {  
  7.     return 1;  
  8.   } else {  
  9.     row = mysql_fetch_row(master); 
  10.      if (row && row[0] && row[1]) {  
  11.       print_comment(md_result_file, 0,  
  12.                     "\n--\n-- Position to start replication or point-in-time "  
  13.                     "recovery from\n--\n\n");  
  14.       // 寫入dump結果  
  15.       fprintf(md_result_file,  
  16.               "%sCHANGE MASTER TO MASTER_LOG_FILE='%s'MASTER_LOG_POS=%s;\n",  
  17.               comment_prefix, row[0], row[1]);  
  18.       check_io(md_result_file);  
  19.     }  
  20.     // ...  
  21.   }  
  22.   return 0;  

5. 解鎖所有表

在正式開始dump操作之前,mysqldump會把前面操作中可能加了鎖的表全部解鎖:

查看main函數中對應部分代碼: 

  1. if (opt_single_transaction &&  
  2.     do_unlock_tables(mysql)) /* unlock but no commit! */  
  3.   goto err; 

可以看到,只有在指定了--single-transaction選項時才會解鎖所有先前被加鎖的表,結合前面的思考可以推斷,--single-transaction下所進行的備份通過事務性質可以保證數據的一致性,沒有必要再保留對所有表所加的鎖,因此這里執行解鎖,以免阻塞其他事務的進行。

6. 對指定的庫與表進行dump

前面的準備操作進行完成后,mysqldump開始正式進行選定庫、表的dump操作:

對指定數據庫的實際dump由dump_databases函數執行(當指定了--all-databases要求dump所有庫時,則由dump_all_databases函數執行)。

查看dump_databases函數的實現: 

  1. static int dump_databases(char **db_names) {  
  2.   int result = 0 
  3.   char **db;  
  4.   DBUG_TRACE;  
  5.   for (db = db_names; *db; db++) {  
  6.     if (is_infoschema_db(*db))  
  7.       die(EX_USAGE, "Dumping \'%s\' DB content is not supported", *db);  
  8.     if (dump_all_tables_in_db(*db)) result = 1 
  9.   }  
  10.   if (!result && seen_views) {  
  11.     for (db = db_names; *db; db++) {  
  12.       if (dump_all_views_in_db(*db)) result = 1 
  13.     }  
  14.   }  
  15.   return result;  
  16. } /* dump_databases */ 

邏輯比較清晰,先dump每個指定的數據庫中所有的表,之后如果存在視圖,則將對應視圖也進行dump。我們的考察重點放在對表的dump上。

實際dump一個表的操作邏輯也比較清晰,就是先獲取表的結構信息,得到表的創建語句,然后獲取表中每行的實際數據并生成對應的insert語句。

不過,前面的general log中有個值得注意的點是SAVEPOINT的出現,這一點在MySQL 5.5的mysqldump中是沒有的,查看dump_all_tables_in_db函數的實現,可以找到設置savepoint的對應代碼: 

  1. // 創建savepoint  
  2.  if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {  
  3.    verbose_msg("-- Setting savepoint...\n");  
  4.    if (mysql_query_with_error_report(mysql, 0, "SAVEPOINT sp")) return 1;  
  5.  }  
  6.  while ((table = getTableName(0))) {  
  7.    char *end = my_stpcpy(afterdot, table);  
  8.    if (include_table(hash_key, end - hash_key)) { 
  9.      dump_table(table, database); // 對表進行dump  
  10.      // 省略部分代碼...  
  11.      // ROLLBACK操作 
  12.      /**  
  13.        ROLLBACK TO SAVEPOINT in --single-transaction mode to release metadata  
  14.        lock on table which was already dumped. This allows to avoid blocking  
  15.        concurrent DDL on this table without sacrificing correctness, as we  
  16.        won't access table second time and dumps created by --single-transaction  
  17.        mode have validity point at the start of transaction anyway.  
  18.        Note that this doesn't make --single-transaction mode with concurrent 
  19.         DDL safe in general case. It just improves situation for people for whom  
  20.        it might be working.  
  21.      */  
  22.      if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) {  
  23.        verbose_msg("-- Rolling back to savepoint sp...\n");  
  24.        if (mysql_query_with_error_report(mysql, 0, "ROLLBACK TO SAVEPOINT sp"))  
  25.          maybe_exit(EX_MYSQLERR);  
  26.      } 

可以看到創建savepoint是在dump表之前,之后遍歷庫中的每個表,每當dump完一個表之后,便執行一次ROLLBACK TO SAVEPOINT sp操作,為什么呢?其實上面代碼的注釋已經解釋清楚了:

簡單來說,當我們dump完一個表后后面都不再需要使用這個表,這時其他事務的DDL操作不會影響我們dump得到數據的正確性,增加savepoint的意義在于,假如我們要dump表A,savepoint記錄了dump表A之前尚未給表A加MDL鎖的狀態,當開始dump表A時,由于要進行一系列select操作,會給表A加上MDL鎖防止其他事務的DDL操作改變表結構導致讀動作出錯;最后當對表A的dump完成后,后續都不會再訪問表A了,此時沒有釋放的MDL鎖沒有意義,反而會阻塞其他并行事務對表A的DDL操作。

對此,MySQL的解決方法是在訪問表A前通過SAVEPOINT sp記錄一個savepoint,在dump完表A之后通過ROLLBACK TO SAVEPOINT sp回到當時的狀態,即可釋放對表A加的MDL鎖,放行其他事務對該表的DDL操作。

小結

以上是mysqldump基于MySQL 8.0的一致性備份原理介紹,相比MySQL 5.5,現如今MySQL 8.0在mysqldump的實現存在一定改進,除了上面提到的savepoint機制是一個顯著區別之外,還有諸如對GTID的支持、對column statistics的dump操作在本文中沒有提及,但總體而言,mysqldump在一致性備份上的實現原理并沒有多少改變。

拓展閱讀——Percona的實現

MySQL從出現到普及,中途也出現了其他不少優秀的發行版,MySQL中一致性備份的實現其實也并不完美,因此如果能夠考量其他發行版在這方面上的實現,也是一件有意義的事情。

Backup Lock

在前面我有提到,mysqldump中--single-transaction選項所實現的一致性備份不需要對表加鎖,但這一特性基于事務型的存儲引擎,因此只對InnoDB表或使用其他事務型存儲引擎類型的表能夠保證備份時過濾掉其他并行事務的更新操作;但對使用了MyISAM這種不支持事務的存儲引擎的表,--single-transaction無法保證其數據的一致性,即若備份過程中出現了來自其他并行事務的更新操作,其很有可能被寫入了備份中。

既然如此,若想對MyISAM的表進行備份,又想保證其一致性該怎么辦?一種方式可以是在執行mysqldump時傳入--lock-all-tables選項,這個選項會使得dump操作進行之前執行一個FLUSH TABLES WITH READ LOCK語句,并保證在dump的全程保持對所有表的讀鎖。但是無疑這是一種overkill,僅僅是為了保證一部分非事務型存儲引擎的表的一致性,就需要對所有表加鎖,進而業務上所有對server的寫操作被阻塞一段時間(若備份的數據量大,這簡直會造成一場災難)。

這一問題,我尚未在MySQL 8.0中找到相應的好的解決方式,不過Percona對此給出了一個方案:在Percona發行版的mysqldump中,執行時可以傳入一個--lock-for-backup選項,這個選項會使得mysqldump在dump之前,執行一個LOCK TABLES FOR BACKUP語句,這是一個Percona獨有的query,其主要做以下幾件事情:

  •  阻塞對MyISAM, MEMORY, CSV, ARCHIVE表的更新操作;
  •  阻塞對任何表的DDL操作;
  •  不阻塞對臨時表與log表的更新操作。

顯然,有了以上的特性,當同時傳入--lock-for-backup與--single-transaction兩個選項同時,mysqldump可以保證所有表的數據一致性,并且盡可能保證造成最少的線上業務干擾。

這一部分邏輯可以在Percona Server 8.0中mysqldump的代碼中找到,在main函數中: 

  1. if (opt_lock_all_tables ||  
  2.     (opt_master_data &&  
  3.      (!has_consistent_binlog_pos || !has_consistent_gtid_executed)) ||  
  4.     (opt_single_transaction && flush_logs)) {  
  5.   if (do_flush_tables_read_lock(mysql)) goto err;  
  6.   ftwrl_done = true 
  7. } else if (opt_lock_for_backup && do_lock_tables_for_backup(mysql))  
  8.   goto err; 

細心的朋友會發現,這是對上面的“關表加讀鎖操作”進行的邏輯改寫,其增加了一個else if邏輯分支,取代了之前的FLUSH TABLES; FLUSH TABLES WITH READ LOCK;操作,主要目的是為了與--single-transaction進行的一致性備份更好地兼容,實現對線上業務盡可能少的阻塞。

接著查看do_lock_tables_for_backup函數的實現,可以看到就是簡單地向server傳入一個Percona獨有的LOCK TABLES FOR BACKUP語句: 

  1. static int do_lock_tables_for_backup(MYSQL *mysql_con) noexcept {  
  2.   return mysql_query_with_error_report(mysql_con, 0, "LOCK TABLES FOR BACKUP");  

Binlog Snapshot

在MySQL 8.0的實現中,有一個常用的選項,仍然會導致“討人厭”的FLUSH TABLES WITH READ LOCK的執行,即--master-data選項。

前面提到,--master-data選項要求在dump之后的結果中存有當前備份開始時的binlog位置,為了滿足所獲得binlog位置的一致性,需要在執行SHOW MASTER STATUS前,獲取對所有表的讀鎖以阻塞所有binlog的提交事件,因此要求執行一次FLUSH TABLES WITH READ LOCK。但是有沒有更好的方式?Percona同樣給出了自己的解決方法。

在Percona Server中,新增了兩個全局status:Binlog_snapshot_file和Binlog_snapshot_pos,分別用來記錄當前的binlog文件與binlog位置,通過SHOW STATUS LIKE 'binlog_snapshot_%'即可獲取兩個status的值。那么使用這個方式,跟SHOW MASTER STATUS有什么區別?

二者的區別在于,Binlog_snapshot_file和Binlog_snapshot_pos這兩個status具有事務性,只要在執行SHOW STATUS LIKE 'binlog_snapshot_%'這個語句之前通過START TRANSACTION WITH CONSISTENT SNAPSHOT創建了新事務與一致性快照,Binlog_snapshot_file和Binlog_snapshot_pos所記錄的則正是該事務開始時的binlog文件與位置信息,進而binlog信息的一致性得到保證,而這一過程的全程都不需要FLUSH TABLES WITH READ LOCK的執行。

相對的,SHOW MASTER STATUS是不具備事務性的,每次執行該語句返回的都是當前最新的binlog位置信息,這也是為什么執行它之前需要對所有表上讀鎖。 

 

責任編輯:龐桂玉 來源: 老葉茶館
相關推薦

2018-08-08 15:51:44

Hash分布式算法

2022-03-22 09:54:22

Hash算法

2020-11-24 09:03:41

一致性MySQLMVCC

2017-07-25 14:38:56

數據庫一致性非鎖定讀一致性鎖定讀

2017-06-27 09:40:28

MYSQL數據備份

2024-04-10 10:34:34

Cache系統GPU

2022-12-14 08:23:30

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數據

2023-08-14 08:10:33

CPU緩存RFO

2021-11-12 08:38:26

一致性哈希算法數據結構

2025-09-08 07:25:16

2020-05-12 10:43:22

Redis緩存數據庫

2022-10-19 12:22:53

并發扣款一致性

2021-06-30 21:13:49

CPUCache數據

2021-02-04 06:30:26

Python編程語言

2022-08-29 08:38:00

事務一致性

2021-06-22 10:22:08

業務IT一致性首席信息官

2021-07-27 08:57:10

算法一致性哈希哈希算法

2016-12-19 18:41:09

哈希算法Java數據
點贊
收藏

51CTO技術棧公眾號

欧美精品久久久| 欧美亚洲伦理www| 久久久久亚洲av无码网站| 天堂av中文在线观看| 久久久久综合网| 91在线视频成人| 日本一级片免费看| av中文一区| 日韩欧美激情在线| 免费av网址在线| av软件在线观看| 国产午夜精品美女毛片视频| 亚洲精品免费在线视频| 天天干在线播放| 欧美区国产区| 最近2019中文免费高清视频观看www99 | 性久久久久久久久久久久久久| 色婷婷av在线| 国产精品色在线观看| 好看的日韩精品| 国产精品久久无码一三区| 免费亚洲一区| 久久久久久美女| 中日韩一级黄色片| 精品美女久久| 亚洲国产美女久久久久| 91pony九色| 日韩一区二区三区免费视频| 亚洲va天堂va国产va久| 浴室偷拍美女洗澡456在线| 电影av在线| 久久综合九色综合97婷婷女人| 97神马电影| 国产乱色精品成人免费视频 | 欧美日韩久久婷婷| 日本另类视频| 色综合久久99| 18禁免费无码无遮挡不卡网站| 四季久久免费一区二区三区四区| 国产精品久久久久aaaa樱花| 欧美一区亚洲二区| 性感美女视频一二三| 成人精品国产免费网站| 97se在线视频| 亚洲黄色在线观看视频| 国产一区二区三区久久久| 国产日韩欧美中文| 一级全黄少妇性色生活片| 久久激情综合网| 国产欧美日韩综合精品| 又骚又黄的视频| 久久99精品网久久| 91在线视频导航| www日本视频| 粉嫩13p一区二区三区| 99视频在线免费观看| 亚洲福利在线观看视频| 国产超碰在线一区| 国产伦精品一区二区三区在线| 亚洲免费成人网| 成人一区在线观看| 精品一区二区视频| 美女欧美视频在线观看免费 | 久久国产免费看| 国产精品自拍小视频| 在线观看国产小视频| 久久丁香综合五月国产三级网站| 91精品在线观| 精品国自产在线观看| 成人午夜在线视频| 蜜桃狠狠色伊人亚洲综合网站| 你懂的视频在线免费| 国产精品卡一卡二卡三| 懂色av粉嫩av蜜臀av| 黑人玩欧美人三根一起进| 欧美日韩激情美女| 亚洲高清在线免费观看| 91成人在线网站| 精品久久人人做人人爱| 久久久亚洲av波多野结衣| 精品日本12videosex| 久久久精品久久久| 中文字幕一区二区三区手机版 | 一起操在线视频| 欧美日韩黄色| 亚洲女人被黑人巨大进入al| 激情高潮到大叫狂喷水| 亚洲一本视频| 国产精品福利观看| www.色婷婷.com| 久久久久久99精品| 特级西西444| 亚洲一区资源| 欧美一卡二卡三卡| 成人免费无遮挡无码黄漫视频| 久久美女精品| 97色伦亚洲国产| 国产一区二区在线视频聊天| 菠萝蜜视频在线观看一区| 日韩欧美第二区在线观看| 色网在线观看| 欧美在线一区二区三区| 熟妇女人妻丰满少妇中文字幕| 西野翔中文久久精品国产| 色偷偷9999www| 国产一级中文字幕| 免费看欧美女人艹b| 国产欧美一区二区在线播放| 国产三级在线免费观看| 亚洲一区二区三区四区五区黄| 午夜dv内射一区二区| 丁香婷婷成人| 久久激情视频久久| 亚洲国产av一区二区三区| 国产91精品久久久久久久网曝门| 亚洲午夜精品一区二区三区| 一本大道色婷婷在线| 91精品国产福利在线观看| 日本激情小视频| 一本久道久久久| 成人免费看片网址| 免费在线观看av网站| 在线视频一区二区三| 男人网站在线观看| 欧美日韩mv| 91九色蝌蚪国产| 在线播放麻豆| 欧洲中文字幕精品| 丰腴饱满的极品熟妇| 91久久综合| 福利精品视频| 国产秀色在线www免费观看| 欧美午夜精品理论片a级按摩| a天堂视频在线观看| 国产精品www.| 成人影片在线播放| 七七久久电影网| 欧美一区二区三区免费视频| 99久久久无码国产精品不卡| 日韩精品一卡二卡三卡四卡无卡| 久久精品二区| 天堂网在线最新版www中文网| 日韩女优av电影| 国产va在线播放| 国产精品亚洲一区二区三区妖精| 超碰97免费观看| 国产精品亚洲综合在线观看| 久久精品国产免费观看| 国产原创中文av| 成人欧美一区二区三区| 潘金莲激情呻吟欲求不满视频| 第一会所亚洲原创| 国产精品香蕉在线观看| 黄色小视频在线免费观看| 色噜噜狠狠成人中文综合| 91精品人妻一区二区三区蜜桃欧美 | 91日韩精品一区| 日韩精品一区二区三区久久| 亚洲天堂日韩在线| 国产精品美女免费| 精品176二区| 欧美一二三区精品| 日本在线视频免费| 久久综合99re88久久爱| 日韩欧美黄色大片| 天天综合亚洲| 国语精品免费视频| 欧美男女交配| 久久精彩免费视频| 亚洲精品成人电影| 欧美午夜性色大片在线观看| 亚洲色图 激情小说| 韩国精品久久久| 日韩精品一区在线视频| 国产乱码精品一区二区亚洲| 国产日本欧美视频| 国产偷倩在线播放| 亚洲人成网站色ww在线| 国产精品无码免费播放| 亚洲成人av一区二区三区| 人妻少妇精品视频一区二区三区| 日韩电影一二三区| 青春草国产视频| 精品一区av| 岛国一区二区三区高清视频| 欧美亚洲韩国| 欧美成人精品在线播放| 欧美日韩伦理片| 日韩一区二区视频在线观看| 美女又爽又黄免费视频| 亚洲欧洲成人精品av97| 亚洲欧美在线不卡| 久久99国产精品麻豆| 人妻少妇精品无码专区二区| 欧美色网址大全| 国产伦精品一区二区三区四区视频 | 色135综合网| 国产麻豆日韩| 高清不卡一区| 日本免费一区二区三区视频观看| 黄色在线免费| 亚洲人成免费电影| 亚洲精品视频91| 欧美日韩成人在线一区| 国产高潮久久久| 亚洲九九爱视频| 在线观看免费小视频| 99久久er热在这里只有精品15| 色一情一区二区三区| 国产精品一二| 成人在线视频一区二区三区| 成人羞羞视频播放网站| 久久爱av电影| 99香蕉久久| 91综合免费在线| 国产精品蜜月aⅴ在线| 97免费中文视频在线观看| 1stkiss在线漫画| 综合网日日天干夜夜久久| 五月婷中文字幕| 精品久久久久香蕉网| 国产精品永久久久久久久久久| 色天使色偷偷av一区二区| 日韩久久精品视频| 亚洲综合成人网| 99视频只有精品| 国产精品传媒在线| 91激情视频在线观看| 久久先锋影音av鲁色资源网| 一区二区免费在线观看视频| 国产福利精品一区| 天美一区二区三区| 激情综合亚洲精品| 国产三级国产精品国产专区50| 免播放器亚洲| 免费毛片小视频| 国产精品一二| 国产日韩一区二区在线观看| 欧美综合国产| 久久久久久久激情| 媚黑女一区二区| 欧美日韩亚洲一| 国产亚洲毛片| 成人羞羞国产免费网站| 欧美亚洲一区| 精品视频无码一区二区三区| 蜜桃伊人久久| 手机在线免费观看毛片| 青青草原综合久久大伊人精品优势| 精品国产成人av在线免| 久久久久中文| 色免费在线视频| 精品一区二区三区在线播放视频 | 久久精视频免费在线久久完整在线看| √天堂资源地址在线官网| 最新的欧美黄色| 黄色动漫在线| 欧美国产日产韩国视频| 国产精品186在线观看在线播放| 久久久久久国产免费| av免费不卡国产观看| 456亚洲影院| 日韩三区免费| 亚洲一区久久久| 粉嫩精品导航导航| 欧美精品七区| 91欧美大片| 国产91在线亚洲| 一本久久综合| 亚洲精品午夜在线观看| 国产老妇另类xxxxx| 国产女人18毛片水真多18| 久久天堂av综合合色蜜桃网| 亚洲a∨无码无在线观看| 樱花草国产18久久久久| 久草国产精品视频| 欧美性视频一区二区三区| 国产欧美熟妇另类久久久 | 国产精品扒开腿做爽爽爽a片唱戏| 99riav一区二区三区| 国产精品一二三区在线观看| 亚洲欧洲国产专区| 久久久久香蕉视频| 欧美丝袜第一区| 国产又粗又猛又黄又爽无遮挡| 精品国偷自产国产一区| 精品美女视频在线观看免费软件 | 成人福利视频网站| 无码人妻丰满熟妇啪啪欧美| 一区二区三区中文字幕电影| 六月丁香激情综合| 91精品国产综合久久福利| 日韩欧美在线观看一区二区| 日韩亚洲精品视频| 久草在线中文最新视频| 91精品美女在线| 偷拍一区二区| 亚洲中文字幕无码一区二区三区| 天堂av在线一区| 欧美做受高潮中文字幕| 国产精品三级视频| 中文字幕在线观看免费视频| 欧美精品v国产精品v日韩精品| 深夜福利免费在线观看| 久久国产精品久久久| 欧美日韩免费观看视频| 精品国产第一页| 欧美激情在线| 亚洲天堂网2018| 国产无一区二区| 99热在线观看免费精品| 日韩视频一区在线观看| 午夜视频在线观看网站| 日韩av电影在线播放| www.神马久久| a级网站在线观看| 老司机精品视频一区二区三区| 精品少妇人妻一区二区黑料社区| 一区二区三区精品在线| 97超碰人人模人人人爽人人爱| 亚洲理论在线a中文字幕| www欧美xxxx| 成人羞羞视频免费| 欧美三级午夜理伦三级中文幕| jizz欧美性11| 欧美国产精品一区二区| 永久免费无码av网站在线观看| 精品国产成人系列| 中文字幕有码在线观看| 91精品久久久久久久久不口人| heyzo久久| 午夜激情福利在线| 久久精品一区四区| 区一区二在线观看| 日韩福利视频在线观看| 国产直播在线| 久久久一本精品99久久精品| 99热这里只有成人精品国产| 中文字幕一区二区三区乱码不卡| 亚洲mv大片欧洲mv大片精品| 国产成人手机在线| 国内精品久久久久久| 国产精品45p| 无码精品a∨在线观看中文| 成人av综合一区| 亚洲一区欧美在线| 亚洲精品永久免费精品| 色8久久影院午夜场| 色姑娘综合av| 久久99国产精品久久| 亚洲xxxx3d动漫| 日韩精品中文字幕一区二区三区| 亚洲男人天堂2021| jizz性欧美23| 在线综合视频网站| 国产专区欧美精品| 欧美成人aaa片一区国产精品| 欧美变态tickle挠乳网站| 黄色成人在线网| 极品日韩久久| 老司机午夜精品视频| 国产一二三av| 欧美成人video| 精品丝袜在线| 日韩av电影免费观看| 久久99日本精品| 久久久www成人免费毛片| 亚洲国产私拍精品国模在线观看| 黄色综合网址| 一区二区三区四区五区精品| 激情综合五月天| 国产精品成人aaaa在线| 亚洲男人av电影| 欧美aaaaaaaa| 岛国大片在线播放| 久久先锋资源网| 国产男女猛烈无遮挡| 77777少妇光屁股久久一区| 精品精品久久| 四虎国产精品免费| 欧美午夜xxx| 免费在线午夜视频| 久久国产精品一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品久久久久久久精| 日韩av在线影院| 99热这里有精品| 激情深爱综合网| 国产精品高潮呻吟| 凸凹人妻人人澡人人添| 国产精品视频免费观看www| 欧美三级第一页| 亚洲欧美日韩第一页| 亚洲精品在线观看网站| 福利视频一区| 欧美 日本 亚洲| 亚洲日本韩国一区| 男人av在线| 国产精品乱码视频| 久久激情五月婷婷|