修改ibdata1大小的验证

ibdata是共享表空间,在MySQL初始化的时候就生成了。

但很多童鞋会看到网上各种大神的调优建议,在MySQL已经初始化的情况下,修改配置文件中innodb_data_file_path=ibdata1:12M:autoextend。导致MySQL启动的时候报错。

下面来模拟一下:

原来的ibdata1大小为12M

# ll -h /sales3306/mysql/data/ibdata1
-rw-rw----. mysql mysql 12M Mar : /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  pages (rounded down to MB) than specified in the .cnf file: initial  pages, max  (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

 :: 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
:: mysqld_safe Logging to '/sales3307/mysql/log/.err'.
:: mysqld_safe Starting mysqld daemon with databases from /sales3306/mysql/data
/usr/local/mysql/bin/mysqld_safe: line : /var/log/mariadb/mariadb.log: No such file or directory
/usr/local/mysql/bin/mysqld_safe: line : /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
:: mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
/usr/local/mysql/bin/mysqld_safe: line : /var/log/mariadb/mariadb.log: No such file or directory
:: mysqld_safe Starting mysqld daemon with databases from /sales3307/mysql/data
:: mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
mysqld_multi log file version 2.16; run: Sat Jan ::

。。。怎么会出现mariadb的信息,这个跟我的操作系统有关,CentOS 7,默认的数据库是Mariadb,而不是MysQL。

失败原因:

没有指定错误日志

指定错误日志后,log-error=/sales3307/mysql/log/error.log

重新启动,又报如下错误:

-- ::  [ERROR] /usr/local/mysql/bin/mysqld: Can't create/write to file '/var/run/mariadb/mariadb.pid' (Errcode: 2 - No such file or directory)
-- :: [ERROR] Can't start server: can't create PID file: No such file or directory
:: 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=
socket=/sales3306/mysql/run/mysql.sock
datadir=/sales3306/mysql/data
server-id=
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=
socket=/sales3307/mysql/run/mysql.sock
datadir=/sales3307/mysql/data
server-id=
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

注意:如果mysqld不是在/usr/local/mysql下,则在每个实例下面还需要添加basedir变量。

在折腾过程中还是蛮多坎坷的,结论就是很个性化的定制,譬如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
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 '';
Query OK, rows affected (0.00 sec) mysql> flush privileges;
Query OK, rows affected (0.00 sec)

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

最后验证的时候,发现直接将password添加到[mysqld_multi]中,并不能关闭实例

# grep "password" -B  multi.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
#用来做关闭mysql使用
user =multiadmin
password=
[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= 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 '';

修改ibdata1大小的验证以及如何使用mysqld_multi管理多实例的更多相关文章

  1. [Linux] -Docker修改空间大小

    Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小. 池空间大小默认为:100G 容器空间大小默认为是:10G 所以修改空间大小也分为两个: 这里使用centos下的yum进行安 ...

  2. Oracle 表空间修改字段大小

    1.修改字段大小 当表中已经存在数据,就不能直接修改某字段大小,需要新建一个字段来过渡   ALTER TABLE TABLE RENAME COLUMN GRP TO FUND_GRP_1; ); ...

  3. python 批量修改图片大小

    一个文件夹下面有好多图片格式是jpg大小是1920*1080,把它们处理成1280*720并按原先图片的名保存在另一路径下这里首先要找到给定路径下所有的图片文件,然后在修改图片文件的大小,这里用到PI ...

  4. 第一章:eclipse 中修改字体大小和编码格式

    eclipse 中修改字体大小的步骤: 1. 在 eclipse 的工具栏中,找到 weindows 下面的 preferences 2. 在 preferences 的 输出 font ,在 Bas ...

  5. IOS 修改UIImage大小

    在iOS中,uiimage没有用于修改大小的属性,要在代码中改变uiimage图片的大小,需要扩展UIImage类,如下: 头文件: #import<UIKit/UIKit.h> @int ...

  6. icheck如何修改样式大小

    icheck默认样式比较大,有需求调整checkbox大小. 1. 最简单的方法可用css3来实现,让整个模块层缩放,不兼容低版本浏览器. transform:scale(0.7,0.7)   2. ...

  7. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  8. word中批量修改图片大小的两个方法

    前言: 对于把ppt的内容拷贝到word中: 对ppt的一页进行复制,然后粘贴到word中 如果要的是ppt运行过程中的内容,在qq运行的情况下,按Ctrl+Alt+A截屏,按勾,然后可以直接粘贴到w ...

  9. tomcat查看并修改jvm大小

    JVM--Java Virtual Machine,Java虚拟机:tomcat不是直接运行在物理操作系统上,而是运行在Java虚拟机上,通常说的配置jvm就是配置分配给Java虚拟机的内存大小: 如 ...

随机推荐

  1. CSS 一些知识点

  2. Torch7学习笔记(三)Sequencialization

    1.序列化 Torch提供4种高级方法来序列化或者反序列化任意Lua/Torch对象.这些方法都是从File对象抽象出来的,为了方便操作而创建. 前两种方法用来从文件序列化或者反序列化的: torch ...

  3. 【ToolKit】轻量级JS库

    优点: 丢弃了一些不常用的方法(jQuery.fn):slideUp.fadeIn.animate等: 新增获取子节点的方法(ToolKit.fn):firstChild,lastChild等: 新增 ...

  4. 工作中那些提高你效率的神器(第二篇)_Listary

    引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...

  5. 有关DTCoreText无法加载网络图片及应用问题

    至于DTCoreText是干嘛的,不清楚的同学自行网上脑补,这就不啰嗦了,只说一下其用法. 里面有三种控件供大家使用,DTAttributedTextView, DTAttributedLabel 和 ...

  6. java并发编程(十七)Executor框架和线程池

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17465497   Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动 ...

  7. XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

    SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...

  8. (翻译)开始iOS 7中自动布局教程(二)

    这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行翻译.前半部分已经转载至本博客,后半部分即本篇.学 ...

  9. 浏览器访问Servlet

    浏览器访问Servlet1.指定一个Servlet路径(                     在web.xml :              <servlet>             ...

  10. vs2013 无法打开 源 文件 "SDKDDKVer.h"

    使用vs2013开发 win32相关的程序的时候,回报很多属性未定义或者文件找不到的错误 例如构建 控制台程序就会报: vs2013 无法打开 源 文件 "SDKDDKVer.h" ...