Syntax highlighting of
db/mysql
# MySQL
[TOC]
## Установка
```bash
sudo apt install mysql-server mysql-client libmysqlclient-dev
```
> Для установки ruby-гема mysql достаточно установить пакет *libmysqlclient-dev*
## Создание БД
```bash
mysql -u root -p
# создание нового пользователя
mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY 'dbpassword';
mysql> GRANT ALL PRIVILEGES ON * . * TO 'dbuser'@'%';
# удаление пользователя
mysql> DROP USER 'demo'@'localhost';
# создание бд
mysql> CREATE DATABASE myapp DEFAULT CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON myapp.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpassword';
mysql> exit
```
## docker
[image](https://hub.docker.com/_/mysql/)
```bash
docker volume create mysql-vol
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=toor \
-v mysql-vol:/var/lib/mysql \
-p 3306:3306 \
-d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker exec -it mysql mysql -u root -p
# Enter password: toor
```
## Backup & Restore
```bash
# создание резервной копии БД database_name
mysqldump database_name > database_name.sql
# создание резервной копии | mysql запущен в докере, дамп укладываем по абс пути
mysqldump -h 127.0.0.1 -u dbuser -pdbpassword moskotova > /home/zoid/tmp/moskotova.sql
# создание резервной копии | mysql запущен в докере, дамп архивируем
mysqldump -h 127.0.0.1 -u dbuser -pdbpassword moskotova | gzip > /home/zoid/tmp/moskotova.sql.gz
# создание резервной копии двух БД
mysqldump --databases database_one database_two > two_databases.sql
# создание резервной копии всех БД
mysqldump --all-databases > all_databases.sql
mysqldump --host=127.0.0.1 --user=root -p --all-databases > all_databases.sql
# создание пустой БД для восстановления
mysqladmin -u root -p create mytestdatabase
# восстановление БД
mysql database_name < database_name.sql
# восстановление одной БД из полного дампа
mysql --one-database database_name < all_databases.sql
# --- dump database
mysqldump -Q -c -e -h 127.0.0.1 -u dbuser -p moskotova | gzip > /home/zoid/tmp/moskotova.sql.gz
# --- copy dump to target db
# --- create empty database
mysqladmin -h 127.0.0.1 -udbuser -p -p create msk2
gunzip < /home/zoid/tmp/moskotova.sql.gz | mysql -h 127.0.0.1 -u dbuser -p msk2
```
## MySQL CLI
[How to Create MySQL Users Accounts and Grant Privileges](https://linuxize.com/post/how-to-create-mysql-user-accounts-and-grant-privileges/)
```sql
# отобразить БД
show databases;
# создать базу данных
create database msk;
# переключение на БД
use DATABASE_NAME;
# отобразить таблицы
show tables;
# описание полей таблицы
describe TABLE_NAME
show tables;
# --- создание пользователя
CREATE USER 'dbuser'@'%' IDENTIFIED BY 'dbpassword';
GRANT ALL PRIVILEGES ON *.* TO 'database_user'@'localhost';
# -- удаление пользователя
DROP USER 'dbuser'@'localhost';
```
## Troubleshooting
### ActiveRecord::StatementInvalid
```bash
ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: '\xD0\xA0\xD0\x95\xD0\x9
A...' for column 'title' at row 1: INSERT INTO `parent_materials` (`title`, `text`, `created_at`, `updated_at`) VALUES ('РЕКОМЕНДАЦИИ РОДИТЕЛЯМ ПО ПОДГОТОВКЕ ДЕТЕЙ К ВЫП', '<p><span s
```
Видимо попытка записи кириллицы в таблицу, которая не поддерживает UTF-8,
Решение
```bash
# заходим в БД
mysql -u root -p
# переключаемся на нужную БД
use DATABASE_NAME;
# конвертируем таблицу в utf-8
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8;
```
> Written with [StackEdit](https://stackedit.io/).