Установка MariaDB рядом с MySQL

Установка MariaDB рядом с MySQL

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

MariaDB это форк MySQL, но мы также можем установить его вместе с MySQL, если это требуется для наших целей.

Скачиваем последнюю версию MariaDB и распаковываем в директорию (я выбрал /opt)

Создаем каталог данных и симлинк

1
2
3
4
5
6
7
8
9
[root@test opt]# mkdir mariadb-data
[root@test opt]# ln -s mariadb-5.5.24-linux-x86_64 mariadb
[root@test opt]# ls -al
итого 16
drwxr-xr-x 4 root root 4096 Янв 23 12:13 .
dr-xr-xr-x 22 root root 4096 Янв 23 10:51 ..
lrwxrwxrwx 1 root root 27 Янв 23 12:13 mariadb -> mariadb-5.5.24-linux-x86_64
drwxr-xr-x 13 root root 4096 Янв 23 12:13 mariadb-5.5.24-linux-x86_64
drwxr-xr-x 2 root root 4096 Янв 23 12:13 mariadb-data

Создаем группу mariadb и пользователя mariadb и выдаем привилегии

1
2
3
4
[root@test opt]# groupadd --system mariadb
[root@test opt]# useradd -c "MariaDB Server" -d /opt/mariadb -g mariadb --system mariadb
[root@test opt]# chown -R mariadb:mariadb mariadb-5.5.24-linux-x86_64/
[root@test opt]# chown -R mariadb:mariadb mariadb-data/

Создаем новый конфигурационный файл my.cnf в директории /opt/mariadb из папки support-files

1
2
[root@test opt]# cp mariadb/support-files/my-medium.cnf mariadb-data/my.cnf
[root@test opt]# chown mariadb:mariadb mariadb-data/my.cnf

Редактируем файл /opt/mariadb-data/my.cnf и редактируем путь, порт и другие важные элементы, необходимые для корректной работы

1
2
3
4
5
6
7
8
9
10
[client]
port = 3307
socket = /opt/mariadb-data/mariadb.sock

[mysqld]
datadir = /opt/mariadb-data
basedir = /opt/mariadb
port = 3307
socket = /opt/mariadb-data/mariadb.sock
user = mariadb

Скопируем init.d скрипт с папки support-files

1
2
[root@test opt]# cp mariadb/support-files/mysql.server /etc/init.d/mariadb
[root@mtest opt]# chmod +x /etc/init.d/mariadb

Редактируем /etc/init.d/mariadb

1
2
3
4
5
6
7
8
- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/opt/mariadb
- datadir=
+ datadir=/opt/mariadb-data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"

Последняя чуть более сложная задача - это внести важные поправки в конфигурационный файл. Необходимо указать MariaDB использовать только определенный конфигурационный файл

В секции start после $bindir/mysqld_safe добавить --defaults-file=/opt/mariadb-data/my.cnf

Должно получиться приблизительно следующее

1
2
3
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --defaults-file=/opt/mariadb-data/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

Также необходимо внести изменения в строке с mysqladmin для функции wait_for_ready(), чтобы MariaDB смога правильно слушать сервер при старте. Для этого добавим в функцию wait_for_ready() после $bindir/mysqladmin путь до конфигурационного файла --defaults-file=/opt/mariadb-data/my.cnf

Выглядеть это будет приблизительно следующим образом

1
2
3
wait_for_ready () {
[...]
if $bindir/mysqladmin --defaults-file=/opt/mariadb-data/my.cnf ping >/dev/null 2>&1; then

Если данная функция будет отсутствовать, то необходимо будет внести изменения в файл запуска

1
2
3
4
5
6
7
8
9
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
=== modified file 'support-files/mysql.server.sh'
--- support-files/mysql.server.sh 2013-07-16 17:09:54 +0000
+++ support-files/mysql.server.sh 2014-02-17 10:10:30 +0000
@@ -147,68 +147,12 @@
datadir_set=1
;;
--pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
+ --socket=*) socket=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
esac
done
}

-wait_for_pid () {
- verb="$1" # created | removed
- pid="$2" # process ID of the program operating on the pid-file
- pid_file_path="$3" # path to the PID file.
-
- i=0
- avoid_race_condition="by checking again"
-
- while test $i -ne $service_startup_timeout ; do
-
- case "$verb" in
- 'created')
- # wait for a PID-file to pop into existence.
- test -s "$pid_file_path" && i='' && break
- ;;
- 'removed')
- # wait for this PID-file to disappear
- test ! -s "$pid_file_path" && i='' && break
- ;;
- *)
- echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
- exit 1
- ;;
- esac
-
- # if server isn't running, then pid-file will never be updated
- if test -n "$pid"; then
- if kill -0 "$pid" 2>/dev/null; then
- : # the server still runs
- else
- # The server may have exited between the last pid-file check and now.
- if test -n "$avoid_race_condition"; then
- avoid_race_condition=""
- continue # Check again.
- fi
-
- # there's nothing that will affect the file.
- log_failure_msg "The server quit without updating PID file ($pid_file_path)."
- return 1 # not waiting any more.
- fi
- fi
-
- echo $echo_n ".$echo_c"
- i=`expr $i + 1`
- sleep 1
-
- done
-
- if test -z "$i" ; then
- log_success_msg
- return 0
- else
- log_failure_msg
- return 1
- fi
-}
-
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
@@ -266,6 +210,69 @@

parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`

+# wait for the pid file to disappear
+wait_for_gone () {
+ pid="$1" # process ID of the program operating on the pid-file
+ pid_file_path="$2" # path to the PID file.
+
+ i=0
+ crash_protection="by checking again"
+
+ while test $i -ne $service_startup_timeout ; do
+
+ if kill -0 "$pid" 2>/dev/null; then
+ : # the server still runs
+ else
+ if test ! -s "$pid_file_path"; then
+ # no server process and no pid-file? great, we're done!
+ log_success_msg
+ return 0
+ fi
+
+ # pid-file exists, the server process doesn't.
+ # it must've crashed, and mysqld_safe will restart it
+ if test -n "$crash_protection"; then
+ crash_protection=""
+ sleep 5
+ continue # Check again.
+ fi
+
+ # Cannot help it
+ log_failure_msg "The server quit without updating PID file ($pid_file_path)."
+ return 1 # not waiting any more.
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
+
+wait_for_ready () {
+
+ test -n "$socket" && sockopt="--socket=$socket"
+
+ i=0
+ while test $i -ne $service_startup_timeout ; do
+
+ if $bindir/mysqladmin $sockopt ping >/dev/null 2>&1; then
+ log_success_msg
+ return 0
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
#
# Set pid file if not given
#
@@ -292,7 +299,7 @@
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
- wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_ready; return_value=$?

# Make lock for RedHat / SuSE
if test -w "$lockdir"
@@ -319,7 +326,7 @@
echo $echo_n "Shutting down MySQL"
kill $mysqld_pid
# mysqld should remove the pid file when it exits, so wait for it.
- wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_gone $mysqld_pid "$mysqld_pid_file_path"; return_value=$?
else
log_failure_msg "MySQL server process #$mysqld_pid is not running!"
rm "$mysqld_pid_file_path"

Устанавливаем базу данных

Запускаем mysql_install_db указывая путь до конфигурационного файла как аргумент

1
2
[root@test opt]# cd mariadb
[root@test mariadb]# scripts/mysql_install_db --defaults-file=/opt/mariadb-data/my.cnf

Запускаем MariaDB

1
2
[root@test opt]# /etc/init.d/mariadb start
Starting MySQL... [ OK ]

Настраиваем автозапуск MariaDB

1
2
3
[root@test opt]# cd /etc/init.d
[root@test init.d]# chkconfig --add mariadb
[root@test init.d]# chkconfig --levels 3 mariadb on

Проверяем работу сервисов

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@test mariadb]# mysql -e "SELECT VERSION();" --socket=/opt/mariadb-data/mariadb.sock
+--------------------+
| VERSION() |
+--------------------+
| 5.5.24-MariaDB-log |
+--------------------+
[root@test mariadb]# mysql -e "SELECT VERSION();" -p
Enter password:
+-----------+
| VERSION() |
+-----------+
| 5.5.41 |
+-----------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@test mariadb]# mysql --socket=/opt/mariadb-data/mariadb.sock 
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.24-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, 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>

Устанавливаем root-пароль

Поскольку в данный момент доступ к базе осуществляется без пароля, что не очень безопасно, то установим пароль для root-пользователя.

1
2
3
4
5
$ mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("new-password") where User='root';
mysql> flush privileges;
mysql> exit

Удаляем анонимных пользователей

1
2
DELETE FROM mysql.user WHERE user='' AND host='myhost';
FLUSH PRIVILEGES;

Удаляем тестовую базу и доступ к ней

1
2
DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Отключаем удаленное подключение к базе

Для этого в конфигурационный файл my.cnf вносим строку в директиву [mysqld]

1
bind-address=127.0.0.1

И в завершении

Мы имеем mariadb.socket, my.cnf файл и базу данных в /opt/mariadb-data, если мы хотим обновить базу данных MariaDB, то:

  • Распаковываем новую версию БД в /opt
  • Меняем симлинк mariadb к указанной директории
  • Запускаем MariaDB
  • Запускаем скрипт обновления используя сокет --socket=/opt/mariadb-data/mariadb.sock