修改ibdata1大小的驗證以及如何使用mysqld_multi管理多實例

来源:http://www.cnblogs.com/ivictor/archive/2016/03/31/5340822.html
-Advertisement-
Play Games

修改ibdata1大小的驗證 ibdata是共用表空間,在MySQL初始化的時候就生成了。 但很多童鞋會看到網上各種大神的調優建議,在MySQL已經初始化的情況下,修改配置文件中innodb_data_file_path=ibdata1:12M:autoextend。導致MySQL啟動的時候報錯。 ...


修改ibdata1大小的驗證

ibdata是共用表空間,在MySQL初始化的時候就生成了。

但很多童鞋會看到網上各種大神的調優建議,在MySQL已經初始化的情況下,修改配置文件中innodb_data_file_path=ibdata1:12M:autoextend。導致MySQL啟動的時候報錯。

下麵來模擬一下:

原來的ibdata1大小為12M

# ll -h /sales3306/mysql/data/ibdata1 
-rw-rw----. 1 mysql mysql 12M Mar 31 21:09 /sales3306/mysql/data/ibdata1

修改配置文件中的innodb_data_file_path參數,調整其大小

innodb_data_file_path=ibdata1:20M:autoextend

重啟資料庫服務

啟動資料庫的過程中沒有報錯,但就是沒有起來,查看日誌信息

[ERROR] InnoDB: auto-extending data file /sales3306/mysql/data/ibdata1 is of a different size 768 pages (rounded down to MB) than specified in the .cnf file: initial 1280 pages, max 0 (relevant if non-zero) pages!

報錯信息其實很明顯,ibdata1實際大小和配置文件中指定的大小不一致。

遇到這種問題,如何修複呢?

其實,只需將該參數設置為等於或者小於其實際大小。

關於等於,其實不難理解,畢竟要吻合,那小於又為什麼可以呢?關鍵在於該參數後面的autoextend選項,所以實際值比初始值大很正常。當然小於的情況只適用於帶有autoextend選項的表空間,MySQL可指定多個表空間,但只有最後一個才能指定該選項。

獲取其實際大小,有兩種方式,

一是通過ls -l查看其具體大小,可直接寫12582912(12M)

二是通過錯誤日誌的報錯信息,譬如上面很容易算出其實際大小為768*16/1024=12M

當然,如果預設的共用表空間體積太大了,可新增一個表空間

innodb_data_file_path=ibdata1:12M;ibdata2:20M:autoextend

註意:共用表空間,即便把數據清理掉後,也不會回收空間,只能遷移數據,重新初始化。

 

mysqld_multi的使用

1. 在執行mysqld_multi時報以下錯誤:

/usr/local/mysql/bin/mysqld_multi --defaults-file=/root/multi.cnf report
WARNING: my_print_defaults command not found.
Please make sure you have this command available and
in your path. The command is available from the latest
MySQL distribution.
ABORT: Can't find command 'my_print_defaults'.
This command is available from the latest MySQL
distribution. Please make sure you have the command
in your PATH.

解決方法:

在/etc/profile中添加如下內容:

export PATH=$PATH:/usr/local/mysql/bin/

並使其生效 source /etc/profile

2. 啟動失敗,通過查看mysqld_multi的錯誤日誌/usr/local/mysql/multi.log 

有如下報錯信息:

Starting MySQL servers

160116 20:25:22 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
touch: cannot touch ‘/var/log/mariadb/mariadb.log’: No such file or directory
chmod: cannot access ‘/var/log/mariadb/mariadb.log’: No such file or directory
touch: cannot touch ‘/var/log/mariadb/mariadb.log’: No such file or directory
chown: cannot access ‘/var/log/mariadb/mariadb.log’: No such file or directory
160116 20:25:22 mysqld_safe Logging to '/sales3307/mysql/log/.err'.
160116 20:25:22 mysqld_safe Starting mysqld daemon with databases from /sales3306/mysql/data
/usr/local/mysql/bin/mysqld_safe: line 129: /var/log/mariadb/mariadb.log: No such file or directory
/usr/local/mysql/bin/mysqld_safe: line 166: /var/log/mariadb/mariadb.log: No such file or directory
touch: cannot touch ‘/var/log/mariadb/mariadb.log’: No such file or directory
chown: cannot access ‘/var/log/mariadb/mariadb.log’: No such file or directory
chmod: cannot access ‘/var/log/mariadb/mariadb.log’: No such file or directory
160116 20:25:22 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
/usr/local/mysql/bin/mysqld_safe: line 129: /var/log/mariadb/mariadb.log: No such file or directory
160116 20:25:22 mysqld_safe Starting mysqld daemon with databases from /sales3307/mysql/data
160116 20:25:23 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
mysqld_multi log file version 2.16; run: Sat Jan 16 20:25:24 2016

。。。怎麼會出現mariadb的信息,這個跟我的操作系統有關,CentOS 7,預設的資料庫是Mariadb,而不是MysQL。

失敗原因:

沒有指定錯誤日誌

指定錯誤日誌後,log-error=/sales3307/mysql/log/error.log

重新啟動,又報如下錯誤:

2016-01-16 20:41:09 18683 [ERROR] /usr/local/mysql/bin/mysqld: Can't create/write to file '/var/run/mariadb/mariadb.pid' (Errcode: 2 - No such file or directory)
2016-01-16 20:41:09 18683 [ERROR] Can't start server: can't create PID file: No such file or directory
160116 20:41:10 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended

失敗原因:沒有指定pid文件

指定pid文件的路徑

pid-file=/sales3307/mysql/run/mysqld.pid

重新啟動,終於啟動成功

# mysqld_multi --defaults-file=/root/multi.cnf report
Reporting MySQL servers
MySQL server from group: mysqld3306 is running
MySQL server from group: mysqld3307 is running

最後貼一下配置文件:

mysqld的部分沒有貼,這塊配置是公用的

[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
#用來做關閉mysql使用
user = root
log=/usr/local/mysql/multi.log
##password=''

[mysqld3306]
port=3306
socket=/sales3306/mysql/run/mysql.sock
datadir=/sales3306/mysql/data
server-id=1003306
log-bin=/sales3306/mysql/log/mysql-bin
tmpdir=/sales3306/mysql/tmp/
innodb_log_group_home_dir = /sales3306/mysql/data
innodb_buffer_pool_size=200M
log-error=/sales3306/mysql/log/error.log
pid-file=/sales3306/mysql/run/mysqld.pid

[mysqld3307]
port=3307
socket=/sales3307/mysql/run/mysql.sock
datadir=/sales3307/mysql/data
server-id=1003307
log-bin=/sales3307/mysql/log/mysql-bin
tmpdir=/sales3307/mysql/tmp/
innodb_log_group_home_dir = /sales3307/mysql/data
innodb_buffer_pool_size=100M
log-error=/sales3307/mysql/log/error.log
pid-file=/sales3307/mysql/run/mysqld.pid

 

在折騰過程中還是蠻多坎坷的,結論就是很個性化的定製,譬如socket,log-error,pid-file都要指定各自的路徑。不然啟動過程中,系統會按預設的來,多實例都按預設的來,會起衝突的。但整個排錯過程還是蠻簡單的,不是看mysqld_multi的錯誤日誌,就是實例本身的日誌。

 

下麵演示一下,mysqld_multi的用法:

[root@spark01 ~]# mysqld_multi --defaults-file=/root/multi.cnf stop

[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf report Reporting MySQL servers MySQL server from group: mysqld3306 is not running MySQL server from group: mysqld3307 is not running
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf report 3306 Reporting MySQL servers MySQL server from group: mysqld3306 is not running
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf start 3306

[root@spark01 ~]# mysqld_multi --defaults-file=/root/multi.cnf report Reporting MySQL servers MySQL server from group: mysqld3306 is running MySQL server from group: mysqld3307 is not running


在上述[mysqld_multi]的配置中,有個user和password,這個是用來執行mysqladmin關閉程式的。

有時候,用root許可權太大,且密碼以明文的方式暴露存在安全風險。

雖然mysqld_multi支持--password選項,但如果兩個實例的密碼不一樣,又如何同時關閉實例呢?

可為兩個實例創建同名賬戶,只賦予shutdown許可權,這樣可解決上述的困擾。

mysql>  grant shutdown on *.* to 'multiadmin'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

-----------------------------------------

最後驗證的時候,發現直接將password添加到[mysqld_multi]中,並不能關閉實例

# grep "password" -B 5 multi.cnf 
[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
#用來做關閉mysql使用
user =multiadmin
password=123456

 

[root@spark01 ~]# mysqld_multi --defaults-file=/root/multi.cnf start
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf report Reporting MySQL servers MySQL server from group: mysqld3306 is running MySQL server from group: mysqld3307 is running
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf stop
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf report Reporting MySQL servers MySQL server from group: mysqld3306 is running MySQL server from group: mysqld3307 is running
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf --password=123456 stop
[root@spark01
~]# mysqld_multi --defaults-file=/root/multi.cnf report Reporting MySQL servers MySQL server from group: mysqld3306 is not running MySQL server from group: mysqld3307 is not running

直接使用stop並不能關閉實例,但是在客戶端指定password卻又可以,用mysqladmin關閉又沒問題。

直接使用stop關閉,multi日誌報如下信息:

Warning: Using a password on the command line interface can be insecure.
^G/usr/local/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'multiadmin'@'localhost' (using password: YES)'

 

當然,[mysqld_multi]中除了用mysqld_safe啟動mysql實例外,也可直接通過mysqld,這時[mysqld3306],[mysqld3307]中需指定user=mysql。

------------------------------------------------

在驗證的過程中,發現給multiadmin如下授權

GRANT ALL PRIVILEGES ON *.* TO 'multiadmin'@'%' IDENTIFIED BY PASSWORD

%並不包括localhost

驗證如下:

mysql> select user,host,password from mysql.user;
+------------+-----------+-------------------------------------------+
| user       | host      | password                                  |
+------------+-----------+-------------------------------------------+
| root       | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root       | spark01   |                                           |
| root       | 127.0.0.1 |                                           |
| root       | ::1       |                                           |
|            | localhost |                                           |
|            | spark01   |                                           |
| multiadmin | %         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------+-----------+-------------------------------------------+

在本機用multiadmin登錄

# mysql --socket=/sales3307/mysql/run/mysql.sock -umultiadmin -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'multiadmin'@'localhost' (using password: YES)

但是不輸入密碼卻又能登錄,只是沒有任何許可權

[root@spark01 ~]# mysql --socket=/sales3307/mysql/run/mysql.sock -umultiadmin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.6.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.28, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:        8
Current database:    
Current user:        multiadmin@localhost
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.6.28-log MySQL Community Server (GPL)
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /sales3307/mysql/run/mysql.sock
Uptime:            32 min 17 sec

Threads: 1  Questions: 22  Slow queries: 0  Opens: 74  Flush tables: 1  Open tables: 67  Queries per second avg: 0.011
--------------

mysql> select user();
+----------------------+
| user()               |
+----------------------+
| multiadmin@localhost |
+----------------------+
1 row in set (0.00 sec)

mysql> select user,host from mysql.users;
ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for table 'users'

這個其實與上面許可權表中的user為空,host為localhost有關。

只要是從本地登錄,不管你指定任何許可權表之外的用戶,都可以登錄,譬如hello用戶在許可權表中並不存在,卻依然可以登錄,就是拜user為空,host為localhost所賜。

[root@spark01 ~]# mysql --socket=/sales3307/mysql/run/mysql.sock -uhello
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.28-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

所以,作為mysql安全加固的一部分,這些賬號都可以刪除的。

總結:如果multiadmin要從本地登錄,必須授予localhost的登錄許可權,%並不包含localhost。

grant all privileges on *.* to 'multiadmin'@'localhost' identified by '123456';

 


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

-Advertisement-
Play Games
更多相關文章
  • 《android註冊頁面》博客中main.xml代碼中每個組件定義的屬性有重覆的部分,為了避免繁瑣可以把各個組件重覆的屬性定義到一個文件中:res/values/style_test.xml源碼: <?xml version="1.0" encoding="utf-8"?><resources> < ...
  • 從昨天下午接到新任務,要採集一個法院網站得所有公告,大概是需要採集這個網站得所有公告列表裡得所有txt內容,txt文件裡邊是一件件赤裸裸得案件,記錄這案由,原告被告等相關屬性(不知道該叫什麼就稱之為屬性吧,汗),把這些文件放到本地某個目錄,並把一個案件作為一條數據放入資料庫中。本以為很輕鬆得用Jso ...
  • 問題場景 最近在項目中遇到了對每一個類型進行求和並且求該類型所占的比例,當時考慮求出每種類型的和,併在java中分別對每一種類型的和與總和相除求出所占比例。後來,想到這樣有點麻煩,並且項目中持久層使用的是iBatis框架,所有考慮從SQL方面進行入手來簡化這個問題。 後來SQL的解決方法就為: 看到 ...
  • 一、主鍵自增長: 1) oracle: 使用序列實現,比如創建序列,起點是1000,步進是1: create sequence myseq increment by 1 start with 1000 增加記錄: insert into student(stuId,stuName) values(m ...
  • 1.Question Description: 1.1 version: mysql-5.7.11-64 1.2 form: zip file 1.3 >mysqld --install (successfully) 1.4 you create a directory called "data" ...
  • 子查詢在一個select中出現多個嵌套查詢語句 1、在where子句中使用子查詢(一般返回"單行單列" "單行多列" "多行單列"(可以提供in、any、all )) 示例1:查找低於平均工資的雇員信息(返回單行單列) 示例2:查找出公司最早雇佣的雇員信息(返回單行單列) 示例3:與scott從事同 ...
  • 一、起因 begin或者START TRANSACTION開始一個事務 rollback事務回滾 commit 事務確認 人們對事務的解釋如下:事務由作為一個單獨單元的一個或多個SQL語句組成,如果其中一個語句不能完成,整個單元就會回滾(撤銷),所有影響到的數據將返回到事務開始以前的狀態。因而,只有 ...
  • 介紹 正則表達式用來描述或者匹配符合規則的字元串。它的用法和like比較相似,但是它又比like更強大,能夠實現一些很特殊的規則匹配;正則表達式需要使用REGEXP命令,匹配上返回"1"匹配不上返回"0",REGEXP相當於like '%%'。 命令 說明 ^ 在字元的開啟處進行匹配 $ 在字元的末 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...