Percona博客學習總結

来源:http://www.cnblogs.com/ivictor/archive/2016/05/06/5465215.html
-Advertisement-
Play Games

1. Upgrading to MySQL 5.7, focusing on temporal types 在MySQL 5.6.4中,對TIME, TIMESTAMP and DATETIME三種時間類型進行了擴充,支持了微秒,並且DATETIME的存儲由之前的8個位元組縮小到5個位元組。 如果從My ...


1. Upgrading to MySQL 5.7, focusing on temporal types

    在MySQL 5.6.4中,對TIME, TIMESTAMP and DATETIME三種時間類型進行了擴充,支持了微秒,並且DATETIME的存儲由之前的8個位元組縮小到5個位元組。

MySQL 5.6.4在Server層新增三種時間類型MYSQL_TYPE_TIME2,MYSQL_TYPE_DATETIME2,MYSQL_TYPE_TIMESTAMP2,併在InnoDB層以二進位的格式存儲,用這種方式來實現時間類型支持小數精度並優化存儲節省空間。

    如果從MySQL 5.5升級到5.6,使用mysql_upgrade,mysql_upgrade並不會顯示的將之前的類型轉換成新類型,只是新建的表會使用新類型。

    但如果是升級到5.7,則mysql_upgrade會將舊類型轉換為新類型,而這可能導致升級的過程比較漫長。

    對於上述情況,如果避免呢?

    1. mysql_upgrade支持upgrade-system-tables選項,在升級時可指該參數,只升級系統表,而不升級普通表

    2. 升級完畢後,再使用alter table或者pt-online-schema-schange修改表的數據類型。

    可通過以下命令查看升級完畢後,各表中上述三個欄位的新舊情況。   

SELECT CASE isc.mtype
           WHEN '6' THEN 'OLD'
           WHEN '3' THEN 'NEW'
       END FORMAT,
       t.schema_name,
       t.table_name
FROM information_schema.tables AS t
INNER JOIN information_schema.columns AS c ON c.table_schema = t.table_schema
AND c.table_name = t.table_name
LEFT OUTER JOIN information_schema.innodb_sys_tables AS ist ON ist.name = concat(t.table_schema,'/',t.table_name)
LEFT OUTER JOIN information_schema.innodb_sys_columns AS isc ON isc.table_id = ist.table_id
AND isc.name = c.column_name
WHERE c.column_type IN ('time','timestamp','datetime')
    AND t.table_schema NOT IN ('mysql','information_schema','performance_schema')
    AND t.table_type = 'base table'
    AND (t.engine = 'innodb');

      註意:5.6中t.shema_name應為t.TABLE_SCHEMA。

      具體可參考:https://www.percona.com/blog/2016/04/27/upgrading-to-mysql-5-7-focusing-on-temporal-types/

2. Best Practices for Configuring Optimal MySQL Memory Usage

    1> The first rule of configuring MySQL memory usage is you never want your MySQL to cause the operating system to swap.Even minor swapping activity can dramatically reduce MySQL performance.

        並不是有了swap就一定是壞事,有可能這些swap是在MySQL啟動之前產生的。重點需要關註的是MySQL運行過程中的SWAP情況。

        這個可以很容易根據vmstat命令中的si和so列看出來。

    2> MySQL的記憶體分配很複雜,There are global buffers, per-connection buffers (which depend on the workload), and some uncontrolled memory allocations (i.e., inside Stored Procedures), all contributing to difficulties in computing how much memory MySQL will really use for your workload.

        比較合理的是查看MySQL使用的virtual memory size (VSZ),這個可通過top命令或者ps aux | grep mysqld查看,單位是KB。

$ ps aux |grep mysqld
bdp      16569  0.0  0.0 103240   868 pts/0    S+   14:35   0:00 grep mysqld
bdp      25883  0.0  0.0 106220  1360 ?        S    Mar25   0:00 /bin/sh ./bin/mysqld_safe
bdp      26716 12.7  2.4 16884956 9652760 ?    Sl   Mar25 7684:17 /home/bdp/mysql/bin/mysqld --basedir=/home/bdp/mysql/ --datadir=/home/bdp/mysql/data/ --plugin-dir=/home/bdp/mysql//lib/plugin --log-error=/home/bdp/mysql/logs/mysqld.log --pid-file=/home/bdp/mysql/run/mysqld/mysqld.pid --socket=/home/bdp/mysql/tmp/mysql.sock
-bash-4.1$ bash

       上圖中,VSZ16884956,大概16.1G    

       VSZ可能會隨著時間發生變化,所以要及時監控這一項,Don’t allow the mysqld process VSZ exceed 90% of the system memory,如果伺服器上還運行了其它的進程,閥值更小,一旦超過這個閥值,要及時發出告警(這點,可通過腳本實現)。

    3> 在大多數情況下,你不能將90%的記憶體分配給MySQL。有以下幾點需要考慮:

        1. 有其它的重要進程運行在同一伺服器上,無論是長期的還是周期性的,或者批量任務。

        2. 對於Innodb,推薦innodb_flush_method=O_DIRECT,這樣就不會使用Operating System File Cache。但是對於MyISAM或者TokuDB,需要操作系統緩存來緩存數據。

        3. 對於MyISAM on disk temporary tables, sort files, some other temporary files,操作系統緩存還是必需的。

    4> 對於一個16G記憶體的伺服器,innodb_buffer_pool_size分配多少比較合適呢?

        Let’s do some math for a specific example. Assume you have a system (physical or virtual) with 16GB of memory. We are only running MySQL on this system, with an InnoDB storage engine and use innodb_flush_method=O_DIRECT, so we can allocate 90% (or 14.4GB) of memory to MySQL. For our workload, we assume connection handling and other MySQL connection-based overhead will take up 1GB (leaving 13.4GB). 0.4GB is likely to be consumed by various other global buffers (innodb_log_buffer_size, Table Caches, other miscellaneous needs, etc.), which now leaves 13GB. Considering the 5-7% overhead that the InnodB Buffer Pool has, a sensible setting is innodb_buffer_pool_size=12G – what we very commonly see working well for systems with 16GB of memory.

    5> 配置完MySQL記憶體,下麵來看看操作系統層面的配置。

        主要涉及以下幾個方面:

        1. SWAP需要開啟麽?

            需要開啟,爭取最小4G,但不能超過伺服器記憶體的25%。有以下兩點原因:

            1> 操作系統可以將記憶體中沒有使用的部分通過swap方式釋放出去,而不是強制它們放到記憶體中。

            2> 如果你的MySQL配置出現錯誤,或者某些進程的記憶體消耗超過預期,會導致MySQL因記憶體溢出(OOM)直接被kill掉,如果有swap,最多是性能下降。

            可通過設置echo 1  /proc/sys/vm/swappiness降低系統對swap的使用,從而避免不必要的swap對性能造成的影響。這個參數定義了系統對swap的使用傾向,預設值為60,值越大表示越傾向於使用swap。

         2. 配置Out Of Memory killer

            echo '-800' > /proc/$(pidof mysqld)/oom_score_adj

            通過設置此值,可使Linux內核優先kill其它進程而不是MySQL。

         3. 在多核伺服器中,關於NUMA的設置。

            在5.7.9中,引入了一個新的系統參數,innodb_numa_interleave,將其設置為1,Enables the NUMA interleave memory policy for allocation of the InnoDB buffer pool

            在之前,可通過numactl --interleave=all進行設置。

            具體可參考:https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

        

  

   

        

    


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

-Advertisement-
Play Games
更多相關文章
  • Handler背景理解: Handler被最多的使用在了更新UI線程中,但是,這個方法具體是什麼樣的呢?我在這篇博文中先領著大家認識一下什麼是handler以及它是怎麼樣使用在程式中,起著什麼樣的作用。 示例說明: 首先先建立兩個按鈕:一個是start按鈕,作用是開啟整個程式。另一個是終止按鈕end ...
  • MySQL伺服器的主從配置,本來是一件很簡單的事情,無奈不是從零開始,總是在別人已經安裝好的mysql伺服器之上 ,這就會牽扯到,mysql的版本,啟動文件,等一些問題。 http://www.cnblogs.com/roucheng/p/phpmysql.html 不過沒關係,先問清楚兩點 1、m ...
  • 無論何時對基礎數據執行插入、更新或刪除操作,SQL Server 資料庫引擎都會自動維護索引。隨著時間的推移,這些修改可能會導致索引中的信息分散在資料庫中(含有碎片)。當索引包含的頁中的邏輯排序(基於鍵值)與數據文件中的物理排序不匹配時,就存在碎片。碎片非常多的索引可能會降低查詢性能,導致應用程式響 ...
  • 同事在Toad裡面執行SQL語句時,突然無線網路中斷了,讓我檢查一下具體情況,如下所示(有些信息,用xxx替換,因為是在處理那些歷史歸檔數據,使用的一個特殊用戶,所以可以用下麵SQL找到對應的會話信息): SQL> SELECT B.USERNAME , 2 B.SID , 3 B.SERIAL# ... ...
  • Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集 ...
  • 前言 上一篇[關係資料庫常用SQL語句語法大全][2]主要是關係型資料庫大體結構,本文細說一下關係型資料庫查詢的SQL語法。 ![SQL數據查詢][1] 語法回顧 SQL查詢語句的順序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必須 ...
  • 現在使用資料庫來寫存儲過程,動不動參數就會用到xml ,當然羅,優勢也很明顯,參數相對固定,而且靈活,如果要修改或者什麼的,中間介面層也不需要做變化,只需要修改封裝的存儲過程以及程式傳參就ok了。 隨著時間慢慢過,有時候就有一個存儲過程,一個xml 來應對整個表的新增,修改,刪除的情況了。而對於這個 ...
  • T-SQL解析json字元串函數及其使用示例 參考博文:http://www.cnblogs.com/huangtailang/p/4277809.html 1、解析json字元串函數,返回表變數 2、存儲過程調用示例 ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...