From d91cf25300264898ce42b87ea331a7eb4b8ba050 Mon Sep 17 00:00:00 2001 From: dannc Date: Fri, 27 May 2022 10:32:54 +0700 Subject: [PATCH] add homework 6.3, tasks 1-2 --- readme.md | 1 + .../06-database/6.3/docker-compose.yml | 16 ++ .../06-database/6.3/dump/test_dump.sql | 52 +++++++ src/homework/06-database/6.3/readme.md | 140 ++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 src/homework/06-database/6.3/docker-compose.yml create mode 100644 src/homework/06-database/6.3/dump/test_dump.sql create mode 100644 src/homework/06-database/6.3/readme.md diff --git a/readme.md b/readme.md index 40af126..221d754 100644 --- a/readme.md +++ b/readme.md @@ -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) diff --git a/src/homework/06-database/6.3/docker-compose.yml b/src/homework/06-database/6.3/docker-compose.yml new file mode 100644 index 0000000..8d07fd2 --- /dev/null +++ b/src/homework/06-database/6.3/docker-compose.yml @@ -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: \ No newline at end of file diff --git a/src/homework/06-database/6.3/dump/test_dump.sql b/src/homework/06-database/6.3/dump/test_dump.sql new file mode 100644 index 0000000..b8ed4b1 --- /dev/null +++ b/src/homework/06-database/6.3/dump/test_dump.sql @@ -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 diff --git a/src/homework/06-database/6.3/readme.md b/src/homework/06-database/6.3/readme.md new file mode 100644 index 0000000..baa8b58 --- /dev/null +++ b/src/homework/06-database/6.3/readme.md @@ -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