天天看点

mariadb单机多实例配置介绍

一、前言

前文己经介绍过了mysql的编译安装与工作流程,由于sun公司己被oracle收购,mysql己成附属品也间接被“收编”了,至于mysql以后是否还会开源,这个谁也不知道……。

二、简介

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。

MariaDB由MySQL的创始人麦克尔·维德纽斯主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自麦克尔·维德纽斯的女儿玛丽亚(英语:Maria)的名字。(维基百科如是说;看到这我突然想起一广告语:还是熟悉的配方,还是原来的味道!!!!)

三、安装流程

注:

1

<code>#ln -s /usr/local/mariadb-Version mysql</code>

这样就可以了。其它的都一样。

四、多实例启动mariadb

那么什么是实例呢?官方的说法,实例指的就是操作系统中一系列的进程以及为这些进程所分配的内存块。如果用更容易理解的方式来解释,那就是说数据库的实例是我们访问数据库的通道。弄清楚什么是实例,那么我们来看一下在mariadb中如何启动多实例。

前提:

己经通过源码或通用二进制格式安装了mariadb.

<a href="http://s3.51cto.com/wyfs02/M01/23/EA/wKiom1NGwd3iIcYeAAE9L9KO9tk825.jpg" target="_blank"></a>

1、初始化多个实例

⑴、建立实例目录

<a href="http://s3.51cto.com/wyfs02/M02/23/EA/wKioL1NGwQKylPqbAAFcUREnN9M332.jpg" target="_blank"></a>

⑵、为数据实例目录初始化

利用mysql用户初始化两个实例

2

<code># scripts/mysql_install_db --datadir=/mariadb/data1 --user=mysql</code>

<code># scripts/mysql_install_db --datadir=/mariadb/data2 --user=mysql</code>

<a href="http://s3.51cto.com/wyfs02/M00/23/EA/wKiom1NGxWTCVp4KAAJoDYKcGsY860.jpg" target="_blank"></a>

⑶、编辑源文件

<code>#vim /etc/my.cnf</code>

在此文件末尾添加如下内容

3

4

5

6

7

8

9

<code>#添加引导模块</code>

<code>[mysqld_multi]</code>

<code>mysqld     = </code><code>/usr/local/mysql/bin/mysqld_safe</code>

<code>#指定程序目录启动文件(mysqld_safe安全模式的启动方式)</code>

<code>mysqladmin = </code><code>/usr/local/mysql/bin/mysqladmin</code>

<code>#指定管理程序所在的目录</code>

<code>user       = mysql</code>

<code>password   = mysql</code>

<code>#指定是那一个用户(必须是系统是存在的用户)</code>

添加两个实例文件

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<code>[mysqld3307]</code>

<code>port=3307</code>

<code>#占用的端口(每一个实例一个端口)</code>

<code>socket=</code><code>/tmp/mysql3307</code><code>.sock</code>

<code>#指定套接字文件所在的目录</code>

<code>pid-</code><code>file</code><code>=</code><code>/tmp/mysql3307</code><code>.pid</code>

<code>#指定锁文件所在位置</code>

<code>max_allowed_packet=1M</code>

<code>net_buffer_length=2k</code>

<code>#包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节</code>

<code>table_open_cache=4</code>

<code>#所有线程打开的表的个数</code>

<code>sort_buffer_size=64k</code>

<code>#排序buffer大小;线程级别</code>

<code>thread_stack=128k</code>

<code>#每个线程的堆栈大小</code>

<code>basedir=</code><code>/usr/local/mysql</code>

<code>#源文件所在的目录</code>

<code>datadir=</code><code>/mariadb/data1</code>

<code>#数据实例目录</code>

<code>server-</code><code>id</code><code>=1</code>

<code>#指定为主服务器</code>

<code>#########################</code>

<code>[mysqld3308]</code>

<code>port=3308</code>

<code>socket=</code><code>/tmp/mysql3308</code><code>.sock</code>

<code>pid-</code><code>file</code><code>=</code><code>/tmp/mysql3308</code><code>.pid</code>

<code>datadir=</code><code>/mariadb/data2</code>

⑷、启动实例

<code>#启动第一个实例</code>

<code># mysqld_multi --defaults-extra-file=/etc/my.cnf start 3307</code>

<code># mysqld_multi --defaults-extra-file=/etc/my.cnf  report</code>

<code>Reporting MySQL servers</code>

<code>MySQL server from group: mysqld3307 is running</code>

<code>MySQL server from group: mysqld3308 is not running</code>

<a href="http://s3.51cto.com/wyfs02/M01/23/EA/wKiom1NGzTGzAoy8AAPOxYM_9CE456.jpg" target="_blank"></a>

启动第二实例[mysqld3308]

<a href="http://s3.51cto.com/wyfs02/M00/23/EA/wKioL1NGzdDig1oSAANJQrkBQ2Y747.jpg" target="_blank"></a>

可以使用

<code>#ps -ef |grep msyql</code>

查看到服务是否启动

⑸、连接实例

第一种方式

<code>#连接第一个实例[mysql3307]</code>

<code># mysql -S /tmp/mysql3307.sock</code>

<code>#使用socket文件连接</code>

<code>MariaDB [(none)]&gt; show session variables like </code><code>"%sock%"</code><code>;</code>

<code>#显示所使用的socket文件</code>

<code>+---------------+---------------------+</code>

<code>| Variable_name | Value               |</code>

<code>| socket        | </code><code>/tmp/mysql3307</code><code>.sock |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>MariaDB [(none)]&gt; show databases;</code>

<code>#显示实例初始化后的数据库</code>

<code>+--------------------+</code>

<code>| Database           |</code>

<code>| information_schema |</code>

<code>| mysql              |</code>

<code>| performance_schema |</code>

<code>| </code><code>test</code>               <code>|</code>

<code>4 rows </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>

①对此实例进行授权管理

<code>MariaDB [(none)]&gt; </code><code>grant</code> <code>shutdown </code><code>on</code> <code>*.* </code><code>to</code>  <code>mysql@localhost identified </code><code>by</code> <code>'mysql'</code> <code>with</code> <code>grant</code> <code>option</code><code>;</code>

<code>Query OK, 0 </code><code>rows</code> <code>affected (0.03 sec)</code>

这样做的目地只有一个,是允许那一个用户关闭此实例,如果不是此用户对此实例关闭,那么此实例会自动重启,也就是说无法正常关闭(当此实例工作过程中意外中断也会自动重启的),这也就解释了什么是安全模式下启动。

<code># mysql -S /tmp/mysql3308.sock</code>

<code>| socket        | </code><code>/tmp/mysql3308</code><code>.sock |</code>

同样也要对此实例进行授权管理

<code>MariaDB [(none)]&gt; grant </code><code>shutdown</code> <code>on *.* to  mysql@localhost identified by </code><code>'mysql'</code> <code>with grant option;</code>

<code>Query OK, 0 rows affected (0.03 sec)</code>

第二种方式

使用TCP/ip连接

<code>#mysql -h localhost --protocol=tcp</code>

当服务启动参数中有--skip-networking,则无法使用tcp协议连接

<a href="http://s3.51cto.com/wyfs02/M00/23/EA/wKioL1NG1yiB8donAAF4Wfd4fTw448.jpg" target="_blank"></a>

总结一下可以使用那些协议连接到mariadb

协议

连接类型

所支持的操作系统

TCP/IP

Local,Remote

ALL

Unix socket file

Local Only

Unix Only

Named pipe

Windows Only

Share    Memory

⑹、关闭实例

<code>#mysqld_multi --defaults-extra-file=/etc/my.cnf stop 3307</code>

<a href="http://s3.51cto.com/wyfs02/M02/23/EA/wKiom1NG2ayCCrPHAAJGwN8tq6Q706.jpg" target="_blank"></a>

也可以使用

<code>#mysqladmin shutdown</code>

这样做了之后mariadb数据库服务己经关闭,但是实例却没有关闭(有图有真像),实例无法连接……

<a href="http://s3.51cto.com/wyfs02/M00/23/EA/wKiom1NG2-mzGT9iAAOuiAHvNCo827.jpg" target="_blank"></a>

从上图可以看到结果了,所以说使用mysqldmin只能治标不治本,还是授权用户管理更便捷

如果想了解更多关于mysqld_multi的更多功能,请mysqld_multi --help

说到应用场景,我能想到的可能就是一主多从的环境(没有真实环境啊…………)

=================完==========================

PS:

   1、实例脚本有时间再补上,有点小遗憾!

本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1393728,如需转载请自行联系原作者