add homework 6.3, tasks 1-2

This commit is contained in:
2022-05-27 10:32:54 +07:00
parent c5157f19fe
commit d91cf25300
4 changed files with 209 additions and 0 deletions

View File

@@ -26,3 +26,4 @@
* [5.5. Оркестрация кластером Docker контейнеров на примере Docker Swarm](/src/homework/05-virtualization/5.5)
* [6.1. Типы и структура СУБД](/src/homework/06-database/6.1)
* [6.2. SQL](/src/homework/06-database/6.2)
* [6.3. MySQL](/src/homework/06-database/6.3)

View File

@@ -0,0 +1,16 @@
---
version: '3.8'
services:
mysql:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: 123
MYSQL_USER: admin
MYSQL_PASSWORD: 123
volumes:
- netology_mysql_data:/var/lib/mysql
- ./dump:/opt/dump
volumes:
netology_mysql_data:

View File

@@ -0,0 +1,52 @@
-- MySQL dump 10.13 Distrib 8.0.21, for Linux (x86_64)
--
-- Host: localhost Database: test_db
-- ------------------------------------------------------
-- Server version 8.0.21
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `orders`
--
DROP TABLE IF EXISTS `orders`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `orders` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(80) NOT NULL,
`price` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `orders`
--
LOCK TABLES `orders` WRITE;
/*!40000 ALTER TABLE `orders` DISABLE KEYS */;
INSERT INTO `orders` VALUES (1,'War and Peace',100),(2,'My little pony',500),(3,'Adventure mysql times',300),(4,'Server gravity falls',300),(5,'Log gossips',123);
/*!40000 ALTER TABLE `orders` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-10-11 18:15:33

View File

@@ -0,0 +1,140 @@
Выполнение [домашнего задания](https://github.com/netology-code/virt-homeworks/blob/master/06-db-03-mysql/README.md)
по теме "6.3. MySQL".
## Q/A
### Задача 1
> Используя docker поднимите инстанс MySQL (версию 8). Данные БД сохраните в volume.
>
> Изучите [бэкап БД](./dump/test_dump.sql) и восстановитесь из него.
>
> Перейдите в управляющую консоль mysql внутри контейнера.
>
> Используя команду \h получите список управляющих команд.
>
> Найдите команду для выдачи статуса БД и приведите в ответе из ее вывода версию сервера БД.
>
> Подключитесь к восстановленной БД и получите список таблиц из этой БД.
>
> Приведите в ответе количество записей с price > 300.
>
> В следующих заданиях мы будем продолжать работу с данным контейнером.
Для запуска контейнера с mysql будет использована конфигурация [docker-compose.yml](./docker-compose.yml).
Для восстановления из бэкапа нужно выполнить следующую команду:
```shell
docker-compose exec mysql bash -c "mysql -uroot -p123 -e 'CREATE DATABASE test_db'"
docker-compose exec mysql bash -c "mysql -uroot -p123 -Dtest_db < /opt/dump/test_dump.sql"
```
Затем нужно подключиться к БД и вывести статус:
```shell
docker-compose exec mysql mysql -uroot -p123
mysql> \status
--------------
mysql Ver 8.0.15 for Linux on x86_64 (MySQL Community Server - GPL)
<...>
```
Подключение к восстановленной базе данных, вывод списка таблиц
и получение всех записей из таблицы `orders` с условием `price > 300`:
```shell
mysql> \u test_db
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| orders |
+-------------------+
1 row in set (0.00 sec)
mysql> select count(id) from orders where orders.price > 300;
+-----------+
| count(id) |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
```
### Задача 2
> Создайте пользователя `test` в БД c паролем `test-pass`, используя:
> - плагин авторизации mysql_native_password
> - срок истечения пароля - 180 дней
> - количество попыток авторизации - 3
> - максимальное количество запросов в час - 100
> - аттрибуты пользователя:
> - Фамилия "Pretty"
> - Имя "James"
>
> Предоставьте привилегии пользователю `test` на операции SELECT базы `test_db`.
>
> Используя таблицу `INFORMATION_SCHEMA.USER_ATTRIBUTES` получите данные по пользователю `test` и приведите в ответе к задаче.
Запрос на создание пользователя:
```sql
CREATE USER 'test'
IDENTIFIED WITH mysql_native_password BY 'test-pass'
WITH MAX_QUERIES_PER_HOUR 100
PASSWORD EXPIRE INTERVAL 180 DAY
FAILED_LOGIN_ATTEMPTS 3
ATTRIBUTE '{"lname": "Pretty", "fname": "James"}';
```
Запрос на предоставление привилегий новому пользователю:
```sql
GRANT SELECT ON test_db.* TO 'test';
```
Запрос на получение данных о новом пользователе и его результат:
```shell
mysql> select * from INFORMATION_SCHEMA.USER_ATTRIBUTES where USER like 'test';
+------+------+---------------------------------------+
| USER | HOST | ATTRIBUTE |
+------+------+---------------------------------------+
| test | % | {"fname": "James", "lname": "Pretty"} |
+------+------+---------------------------------------+
1 row in set (0.00 sec)
```
### Задача 3
> Установите профилирование `SET profiling = 1`.
> Изучите вывод профилирования команд `SHOW PROFILES;`.
>
> Исследуйте, какой `engine` используется в таблице БД `test_db` и **приведите в ответе**.
>
> Измените `engine` и **приведите время выполнения и запрос на изменения из профайлера в ответе**:
> - на `MyISAM`
> - на `InnoDB`
// todo
### Задача 4
> Изучите файл `my.cnf` в директории /etc/mysql.
>
> Измените его согласно ТЗ (движок InnoDB):
> - Скорость IO важнее сохранности данных
> - Нужна компрессия таблиц для экономии места на диске
> - Размер буффера с незакомиченными транзакциями 1 Мб
> - Буффер кеширования 30% от ОЗУ
> - Размер файла логов операций 100 Мб
>
> Приведите в ответе измененный файл `my.cnf`.
// todo