Шпаргалка по работе с MySQL

Запуск сервера баз данных (Mysql+Postgresql) в виде docker-compose.yml.

Во внешний том вынесены конфигурации и данные MySQL и Postgresql, также настроены health-чеки контейнеров.

version: "3.9"
services:
    mysql:
      container_name: mysql
      image: mysql:5.7
      ports:
        - "3306:3306/tcp"
      stdin_open: true
      tty: true
      restart: always
      environment:
        - MYSQL_ROOT_PASSWORD=password
      healthcheck:
          test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
          timeout: 20s
          retries: 10
      volumes:
      - ./mysql-data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
      - /etc/localtime:/etc/localtime:ro

    postgresql:
      container_name: postgresql
      image: postgres:11.2-alpine
      restart: always
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=password
      ports:
        - '5432:5432'
      healthcheck:
        test: ["CMD-SHELL", "pg_isready"]
        interval: 20s
        timeout: 10s
        retries: 5
      volumes: 
        - ./postgresql-data:/var/lib/postgresql/data
        - /etc/localtime:/etc/localtime:ro

Изменить часть строки в столбце

Для автоматизации этой рутинной операции существует две функции REPLACE и REGEXP_REPLACE первая заменяет все вхождения искомой строки на новую, а вторая соответственно делает то же самое, но на базе регулярных выражений. Вот собственно два примера как это работает:

REPLACE

UPDATE TestTable settext=REPLACE(text,'http://emulator','http://crm')

REGEXP_REPLACE

UPDATE TestTable settext= REGEXP_REPLACE(text,'^http://emulator','http://crm');

Настройка Master-Master репликации двух баз данных MySQL

Подготовка хостов

На первом хосте добавляем опции:

# Replication settings
server_id = 1
log_bin = mysql-bin.log
log_bin_index = mysql-bin.log.index
relay_log = mysql-relay-bin
relay_log_index = mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema

Перезапускаем:

# systemctl restart mysql

Логинимся в консоль Mysql и проверяем статус Master-а:

# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 124
Server version: 10.3.14-MariaDB-log MariaDB Server

Copyright (c)2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+-------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                                |
+------------------+----------+--------------+-------------------------------------------------+
| mysql-bin.000002 |      782 |              | mysql,sys,performance_schema,information_schema |
+------------------+----------+--------------+-------------------------------------------------+
1 row in set(0.000 sec)

 На втором хосте все настройки и шаги аналогичные, кроме:

# Replication settings
server_id = 2
...

Создаем пользователей для репликации

 На первом сервере выполняем команду (в консоли mysql):

> > GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.54.110.41' IDENTIFIED BY 'secretPASSWORD';

 Проверяем, что пользователь создан:

MariaDB [(none)]> select Host, User from mysql.user where User='replication';
+--------------+-------------+
| Host         | User        |
+--------------+-------------+
| 10.54.110.41 | replication |
+--------------+-------------+
2 rows in set(0.000 sec)

На втором сервере аналогично, но разрешаем доступ с адреса  первого.

> > GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.77.77.254' IDENTIFIED BY 'secretPASSWORD';

Снимаем дамп необходимых таблиц с первого сервера и разворачиваем на втором

Первый сервер:

# mysqldump database > /tmp/dump.sql
# scp /tmp/dump.sql chernousov@10.54.110.41:/tmp/

Второй сервер:

# cat /tmp/dump.sql | mysql database

Настраиваем репликации второго сервера с первого

Данные по текущему бинлогу и позиции мастера берем естественно с мастера:

> STOP SLAVE;
> CHANGE MASTER TO master_host='10.77.77.254', master_port=3306, master_user='replication', master_password='secretPASSWORD', master_log_file='mysql-bin.000001', master_log_pos=782;
> START SLAVE;

Настраиваем репликации первого сервера со второго

Данные по текущему бинлогу и позиции мастера берем естественно с мастера:

> STOP SLAVE;
> CHANGE MASTER TO master_host='10.54.110.41', master_port=3306, master_user='replication', master_password='secretPASSWORD', master_log_file='mysql-bin.000002', master_log_pos=342;
> START SLAVE; 0

Ошибка row size is 8155 which is greater than maximum allowed size (8126) при работе с временными таблицами

В конфиге надо вот такое допилить:

internal_tmp_disk_storage_engine = MyISAM

Резервное копирование всех баз данных MySQL кроме системных

#!/bin/sh

MYSQL_USER=root
MYSQL_PASS=SecretPassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS} -h 127.0.0.1"
#
# Collect all database names except for
# mysql, information_schema, performance_schema and sys
#
SQL="SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN"
SQL="${SQL} ('mysql','information_schema','performance_schema','sys')"
 
DBLISTFILE=/tmp/DatabasesToDump.txt
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${DBLISTFILE}
 
DBLIST=""
for DB in `cat ${DBLISTFILE}` ; do DBLIST="${DBLIST} ${DB}" ; done
 
MYSQLDUMP_OPTIONS="--routines --triggers --single-transaction"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} --databases ${DBLIST} > dump.sql

Обслуживание базы данных

Инициализация каталога с данными:

# mysqld --initialize-insecure --user=mysql
# mysql_install_db --user=mysql

Работа с пользователями

Список пользователей:

>SELECT * FROM mysql.user;

Смена пароля пользователя root:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'PassoRD7';
ALTER USER 'root'@'%' IDENTIFIED BY 'PassoRD7';
FLUSH PRIVILEGES;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *