我的wp个人博客
1.资源概述
由于实验室机器太少,手上只有一个服务器和自己的小笔记本,一直想玩玩这种感觉高大上的mysql集群,今天终于下定决心进行。
在这里,我遇到了两个问题,先给大家阐述一下,希望能帮助大家
- 一台机器里面如何装多个mysql
- 为复制而创建的用户不能本地登录
下面围绕这两个问题进行解决。
2.如何在一台机器里面安装多个mysql
显然这个是开多个mysql的实例,只是对应着不同的端口就可以轻松达成。
下面讲讲我的做法。
1. 下载mysql源码,我这里下载的是mysql5.5.32的
2. 使用牛叉的cmake、make、make install进行安装
安装第一个实例mysql1
首先cmake
cmake \
-DCMAKE_INSTALL_PREFIX=/data/mysql1 \ #安装路径
-DMYSQL_DATADIR=/data/mysql1/data \ #数据文件存放位置
-DSYSCONFDIR=/etc \ #my.cnf路径
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #支持MyIASM引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #支持InnoDB引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \ #支持Memory引擎
-DWITH_READLINE=1 \ #快捷键功能(我没用过)
-DMYSQL_UNIX_ADDR=/data/mysql1/mysql1.sock \ #连接数据库socket路径
-DMYSQL_TCP_PORT=3306 \ #端口
-DENABLED_LOCAL_INFILE=1 \ #允许从本地导入数据
-DWITH_PARTITION_STORAGE_ENGINE=1 \ #安装支持数据库分区
-DEXTRA_CHARSETS=all \ #安装所有的字符集
-DDEFAULT_CHARSET=utf8 \ #默认字符
-DDEFAULT_COLLATION=utf8_general_ci
执行完毕之后我们然后make & make install
这样我们的mysql就安装好了。
然后我们需要做的事情就是为这个实例写一个配置文件
3. 为我们的这个实例搞一个配置文件
配置文件这个东西其实mysql都准备好了的,我们只需要拿出来改一改,进入到我们的安装目录/data/mysql1,将support-file文件夹下的my-medium.cnf作为我们的配置文件吧,
我将my-medium.cnf拷贝到了/data/mysql1目录下,并重命名为my.cnf,命令如下
cp my-medium.cnf ../my.cnf
打开我们的my.cnf,我们主要是需要改如下几个地方
[client]
#password = your_password
port = 3308
socket = /data/mysql1/mysql1.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3308
socket = /data/mysql1/mysql1.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql1-bin
# binary logging format - mixed recommended
binlog_format=mixed
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 2
port不用说了,这个肯定是为每一个mysql确定一个端口,socket这个是指每个mysql实例需要用的sock文件,server-id这个是全局统一的id号,不可以出现重复的,这三个地方是需要注意的。
4. 配置文件更改完毕之后,我们对mysql这个实例进行初始化
进入到scripts文件夹下,运行下面的命令
./mysql_install_db --defaults-file=/data/mysql1/my.cnf --basedir=/data/mysql1 --datadir=/data/mysql1/data --user=mysql
--defaults-file是指我们刚刚修改的配置文件,
注意这里必须要用绝对路径,用相对路径就是个坑,坑爆了。
--basedir是指我们的这个实例所在的安装目录。
--datadir是指我们这个实例以后放数据的文件夹
5.这个脚本执行成功之后,我们进入到其bin的文件夹下准备启动它
执行以下命令
./mysqld_safe --defaults-file=/data/mysql1/my.cnf
一般的情况下,我们不出意外就可以启动它了
6.设置root的密码和远程访问的权限
./mysqladmin -P 3308 -S /data/mysql1/mysql1.sock -u root password
由于我们是多个实例,所以我们需要随时指定-P端口 -S sock文件
为了方便,我自己写了两个小脚本进行处理,入参如下
第一个脚本runSQL.sh,主要是进行关闭和启动mysql的
第一个参数是实例编号,像上面我们在/data/mysql1所以编号是1;
第二个参数是命令,shutdown和start,分别控制启动和关闭
第三个参数是端口号
以上三个参数都需要加上
dir='/data/mysql';
para=$1;
port=$3;
#echo $para;
sqlBasedir=$dir$para;
sqlDatadir=$sqlBasedir'/data';
sqlRundir=$sqlBasedir'/bin';
sqlConfigdir=$sqlBasedir'/my.cnf';
sqlRunSock=$sqlBasedir'/mysql'$para'.sock';
echo $2;
echo $sqlRundir;
cmd="start";
if [ "$cmd"x = "$2"x ];then
echo 'start';
$sqlRundir/mysqld_safe --defaults-file=$sqlConfigdir --user=mysql&
echo 'ok';
#echo $sqlBasedir;
#echo $sqlDatadir;
else
echo 'shutdown';
$sqlRundir/mysqladmin -P $port -S $sqlRunSock -uroot -p shutdown;
fi
第二个脚本是enterSQL.sh,主要是通过root账号进入到mysql控制台
第一个参数是实例编号,意义同上一个脚本
第二个参数是端口号
dir='/data/mysql';
para=$1;
port=$2;
#echo $para;
sqlBasedir=$dir$para;
sqlDatadir=$sqlBasedir'/data';
sqlRundir=$sqlBasedir'/bin';
sqlConfigdir=$sqlBasedir'/my.cnf';
sqlRunSock=$sqlBasedir'/mysql'$para'.sock';
$sqlRundir/mysql -P $port -S $sqlRunSock -uroot -p ;
这下我们安装好了一个区别于一般情况的mysql实例了。
下面只需要重复上面的步骤,分别把上面my.cnf中的红色的地方换掉就可以了。
3.新建的用户不能本地登录
一开始我为主从复制创建了一个新的用户,结果我发现,新创建的用户是不能本地登录的!以至于我的slave总是连接不上master而不能进行复制操作。
参考下文
mysql新建用户无法登陆解决办法
4.来做我们的主从复制吧~
· 在master上创建一个复制账号并且授权
create user repl_user;
grant replication slave on *.* to repl_user@'%' identified by '123456';
然后在slave上进行如下配置
change master to master_host='localhost' master_port=3309 master_user='repl_user' master_password='123456'
因为是在一台机器上所以host就是localhost,我选取的是一个端口为3309的mysql实例。
执行完这句之后,然后执行
有问题欢迎交流~