Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 2296 сообщений
Cообщения с меткой

mysql - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Релиз DataGrip 2016.2: Импорт CSV, поддержка JSON и XML в строках, динамический SQL, улучшения для PostgreSQL

Четверг, 21 Июля 2016 г. 16:18 (ссылка)

Привет! У нас пора релизов. Это пост о том, что интересного в новой версии DataGrip — нашей IDE для SQL. Эти изменения также касаются IntelliJ IDEA, PyCharm, PhpStorm и RubyMine — тех инструментов от JetBrains, где есть поддержка баз данных.



image



Вот, что мы добавили:







Импорт CSV



Старый способ был неудобный. Мы добавили интерфейс для импорта — теперь выбирайте из контекстного меню источника данных пункт Import from file…, указывайте путь к файлу и вперёд.



Откроется диалоговое окно, в котором есть опции для описания структуры файла — используемый разделитель, кавычки, наличие заголовков и т. д. В правой части укажите типы полей и другие характеристики таблицы, в которую попадут данные. По клавише Delete можно удалять столбцы из скрипта создания этой таблицы. Если при импорте возникнут ошибки, процесс не прекратится, а информация об ошибках запишется в текстовый файл — в нижней части окна укажите, где его создать.







Выбор схем



Схемы, которые вы видите в окне базы данных теперь выбирайте прямо из дерева. Во вкладке Schemas свойств источника данных их больше нет. Помните, что консоль знает только об объектах из этого дерева.







Поддержка языков в строковых литералах



Строковому литералу можно присвоить определённый язык и пользоваться возможностями IDE по работе с ним — подсветкой, автодополнением и другими. Это может быть JSON, XML, регулярные выражения или любой диалект SQL.

Когда DataGrip понимает, что в поле содержатся JSON данные или XML — поддержка осуществляется автоматически.



Скажем, мы вставляем значение в поле типа JSON.







Если вы указываете значение для поля по умолчанию, происходит то же самое — здесь IDE поняла, что вы используете XML, и возможности по работе с этим языком стали доступны. Это переименование элементов, поиск вхождений, движение элементов в стороны и т. д. Не забудьте заглянуть на страницу документации о поддержке XML в наших инструментах.







По умолчанию встроены только два типа, для которых языки поддерживаются автоматически, — JSON и XML. Но если у вас есть тип данных, для которого вы хотите иметь то же самое, то выберите Inject by Type из меню подсказок по Alt+Enter.







В примере используется тип CUSTOMDATA, но, допустим, у нас всегда используется XML для типов, имя которых заканчивается на DATA. Имя типов, для которых будет осуществляться автоматическая поддержка, описывается в регулярном выражении (?i).*DATA. Можно на ходу проверить, соответствует ли шаблону та или иная строка, в данном случае — имя вашего типа.







Шаблоны имен типов для поддержки языков в литералах попадают в Settings/Preferences -> Editor -> Language Injections.







Проверить строку на соответствие регулярному выражению можно теперь где угодно. По Alt+Enter укажите соответствующий язык, а потом опять по Alt+Enter выберите Check Regexp.







Ещё один способ сообщить среде о языке в строковом литерале — комментарий вида language=%name%. В следующем примере применён динамический SQL — внутри строки заработало автодополнение и навигация: среда поняла, какие объекты используются в запросе внутри строки.







Табличный редактор



Для значений внутри таблицы мы добавили дополнение по значениям в поле, которое вызывается по Ctrl(Cmd)+Space. Это напоминает уже существующий тип дополнения, который вызывается по Alt+/, — оно ищет по всем используемым словам во всех открытых файлах.







Специфические улучшения для PostgreSQL: можно редактировать поля с типами range.







И поля с временными зонами.







Размер столбцов теперь меняется по Ctrl(Cmd)+Shift+Left/Right. Все столбцы выделяйте по Shift+Space, как в Excel.







Консоль



Как и все другие среды разработки на платформе IntelliJ, мы теперь поддерживаем лигатуры. Для этого их должен поддерживать и сам шрифт, который вы установите. Это могут быть FiraCode, Hasklig, Monoid или PragmataPro.







Получается вот что:







Милая фича для тех, кто использует несколько языков, то есть для нас с вами: автодополнение поможет, если забыли переключить раскладку.







В меню Surround with (Ctrl/Cmd+Alt+T) появился пункт Surround with function — выбранные выражения возьмутся в скобки, а курсор будет помещен перед первой скобкой. Раньше эта штука не работала с мультикурсорами, теперь все нормально.







Для PostgreSQL мы поддержали search path — добавляйте и удаляйте схемы из меню в верхней части консоли.







Подключение



В окне подключения теперь работает дополнение имен в полях сервера, экземпляра и базы данных.







В прошлый раз было много комментариев о проблемах с подключением к SQL Server. Мы написали небольшое руководство по решению основных проблем с этим.



Перекомпиляция пакетов в Oracle



Соответствующий пункт добавлен в контекстном меню, причем перекомпилировать можно только те пакеты, которые в этом нуждаются. Для этого выберите Invalid objects only.







Экспорт схемы



Теперь можно экспортировать сразу всю схему или выбранные таблицы. Мы начали работу по интеграции DataGrip с внешними инструментами pg_dump и mysqldump, так что пишите пожелания в комментариях!







Изображения как фон IDE



В меню Find Action (Ctrl(Cmd)+Shift+A) найдите Set Background Image или выберите соответствующий пункт контекстного меню файла с изображением. Затем настройте прозрачность и другие параметры фона. Это появилось во всех IDE на платформе IntelliJ.







Если хотите узнать больше, добро пожаловать на страницу What’s new, и не забудьте заглянуть в Features, вдруг чего-то не знали?



Будем рады, если вы попробуете DataGrip 2016.2 и расскажете о впечатлениях, пока мы готовим первое небольшое обновление.



Команда DataGrip.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/306152/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] ORM на php для MySQL реальность (часть первая)

Воскресенье, 17 Июля 2016 г. 10:52 (ссылка)

После долгих поисков интересующей меня библиотеки на php для связи с MySQL сел и написал свою, наиболее подходящую для использования в проектах. Данная тема займет небольшой цикл статей, который будет полезен не только профессиональным разработчикам веб-приложений, но и начинающим. Следует отметить, что представленная ниже ORM библиотека, которую, кстати, я назвал kitty, является результатом долгих мучений и не является обязательной библиотекой всех проектов.



Библиотека по моему видению должна иметь два файла (по крайней мере на начальных этапах):


  • файл библиотеки — kitty.php;

  • файл объектного изображения модели базы данных — modeldb.php.





Начнем с последнего. Файл изображения базы данных должен в себе содержать классы, по названию схожие с названием таблиц и содержать в себе поля в соответствии со столбцами таблиц. Т.е. если у нас есть таблица authors с полями idauthor,Name,Year (Идентификатор, ФИО, Годы жизни), то класс будет выглядеть следующим образом:

class authors extends kitty {
public $idauthor;
public $Name;
public $Year;
}


Идентификатор должен следовать первым.



Обычно, класс изображения базы данных содержит в себе все таблицы, которые kitty генерирует автоматически, но об этом позже (все в данной статье не уместишь), и подключается после kitty. А теперь приступим к самому интересному, к нашей библиотеке.



Свойства класса kitty



Класс kitty является абстрактным классом и имеет в своем составе (по моему видению) два ключевых свойства:

	private static $db;	//Объект базы данных
private static $stack; //Стэк запросов


Экземпляр класса $db хранит в себе подключение к базе данных, используя улучшенных класс mysqli.

Экземпляр класса $stack хранит в себе стек запросов и результаты этих запросов, используя класс SplStack.

На этом свойства закончились, все лаконично и просто, теперь перейдем к сладкому.



Методы класса kitty



В данной статье рассмотрим несколько главных методов класса, чтобы понять основную идею построения библиотеки. В ООП существуют статические методы, которые объявляются в памяти один раз и не изменяются, и не статически, появляющиеся в памяти при создании экземпляра и живущие вмести с ним пока живет экземпляр.

Статические методы данной библиотеки являются обобщенными, необходимыми не для экземпляров базы данных. Не статические методы охватывают зону действия одного или нескольких экземпляров базы данных.



Статические методы



Ключевым статическим методом для соединения с базой данных является setup:

	static public function setup(mysqli $dbi,$enc = "utf8"){
if (is_object($dbi)){
self::$db = $dbi;
self::$stack = new SplStack(); //Стэк запросов
return self::setEncoding($enc); //Запрос на кодировку
}else{
throw new Exception("Параметр $dbi не является объектом mysqli", 1);
return false;
}
}


В качестве параметра мы передаем экземпляр класса mysqli и кодировку, которая по умолчанию является utf8. При инициализации заносится экземпляр MySQLi и стек. Результатом ответа является запрос, т.е. проверка на корректность соединения. Строчка kitty::setup(new mysqli) является единственной настройкой библиотеки.

Кодировка устанавливается запросом setEncoding. Код метода представлен ниже:

	static function setEncoding($enc){
$result = self::$db->query("SET NAMES '$enc'"); //Отправляем запрос
self::$stack->push("SET NAMES '$enc' [".($result ? "TRUE" : self::getError())."]");
return $result ? true : false; //Возвращаем ответ
}


В случае возникновения ошибки, заносим в стек запрос и ошибку, и соответственно возвращаем false.

Функция получения ошибки очень лаконичная:

	static function getError(){
return self::$db->error." [".self::$db->errno."]";
}


Возвращаем текст ошибки (error) и код ошибки (errno).



Каждая, уважающая себя, ORM библиотека должна содержать экранирование (к.т.н., доц. Ковженкин В.С.)




Эту возможность реализует функция mysqli_real_escape_string, но она является длинной и принимает два параметра. Заменим, для удобства, эту функцию на представленную ниже:

	private static function escape($string) {
return mysqli_real_escape_string(self::$db,$string);
}


Функция принимает строку и возвращает экранированную для SQL-запроса. С помощью нее мы забываем о SQL-инъекциях, что является немаловажным фактом!



Чтобы выбрать поля таблицы, а конкретней свойства класса таблицы, воcпользуемся средствами php для работы с классами.

Код функции представлен ниже:

	private static function _getVars(){
return array_filter(get_class_vars(get_called_class()),function($elem){
if (!is_object($elem)) return true;
});
}


Функция забирает все свойства и фильтрует их. Если свойство является объектом, а она выбирает еще stack и db, то оно не входит. На выходе массив с полями таблицы. При вызове authors::_getVars(); функция вернет массив array(«idauthor»,«Name»,«Year»).



Выборка данных



Выборка данных является щекотливой темой для ORM библиотек и возникает вопрос, как данные доставать и как их представлять.

В текущей статье мы рассмотрим только один вариант запроса.



Метод является статическим и выбирает из базы данных один экземпляр по идентификатору (findID).

Код функции представлен ниже:

	static function findID($id){
if (is_numeric($id)){ //Если число, то ищем по идентификатору
$query = "SELECT * FROM `".get_called_class()."` WHERE `".key(self::_getVars())."` = $id LIMIT 1";
$result = self::$db->query($query); //Отправляем запрос
self::$stack->push($query." [".$result->num_rows."]"); //Заносим запрос в стек
if ($result->num_rows == 1){ //Если запрос вернул строку
$row = $result->fetch_object(); //Строку запроса в класс
$cName = get_called_class(); //Получем название класса
$rClass = new $cName(); //Создаем экземпляр класса
foreach ($row as $key => $value) $rClass->$key = $value; //Переносим свойства класса
return $rClass; //Возвращаем класс
} else return false; //Если строка не найдена, то ложь
} else return false; //Если не число возвращаем ложь
}


Код подробно описан комментариями и не требует дополнительного описания.

Получить экземпляр можно следующим образом:

    $auth = authors::findID(2);
if ($auth){
//Действия
}else{
//Если не найден
}




Не статические методы



Хватит статических методов, перейдем к не статическим. Методы, которые относятся к конкретному экземпляру.

Выше мы выбрали экземпляр автора с идентификатором 2. Если запрос успешно выполнится, то у нас окажется экземпляр класса:

    $auth->idauthor = 2;
$auth->Name = "Тургенев Иван Сергеевич";
$auth->Year = "1818—1883";


Изменять параметры очень просто, а как же сохранять?

Сохранять так же просто. Ниже представлен код функции для сохранения:

	public function Save(){									//Сохраняем объект - UPDATE	
$id = key(self::_getVars()); //Получаем идентификатор
if (!isset($this->$id) || empty($this->$id)) return $this->Add(); //Если пусто, добавляем
$query = "UPDATE `".get_called_class()."` SET "; //Формируем запрос
$columns = self::_getVars(); //Получем колонки таблицы
$Update = array(); //Массив обновления
foreach ($columns as $k => $v) { //перебираем все колонки
if ($id != $k) //Убираем идентификатор из запроса
$Update[] = "`".$k."` = ".self::RenderField($this->$k); //Оборачиваем в оболочки
}
$query .= join(", ",$Update); //Дополняем запрос данными
$query .= " WHERE `$id` = ".self::escape($this->$id)." LIMIT 1"; //Дополняем запрос уточнениями
$result = self::$db->query($query);
self::$stack->push($query." [".($result ? "TRUE" : self::getError())."]"); //Стек результатов
return ($result) ? true : false; //Возвращаем ответ
}


Код оснащен комментариями и дополнительного описания не требует. Для изменения имени в соответствии с предыдущим примером необходимо выполнить следующий код:

        $auth->Name = "Толстой Лев Николаевич";
echo $auth->Save() ? "Успешно" : "Запрос не удался((";




Функция Save имеет в себе замечательную функцию RenderField. Функция очень важная, является статической и отвечает за правильность построения запроса, ее код представлен ниже:

	private static function RenderField($field){
$r = ""; //Строка для возвращения
switch (gettype($field)) { //Селектор типа передаваемого поля
case "integer": case "float": //Тип int или float
$r = $field;
break;
case "NULL": $r = "NULL"; break; //Тип NULL
case "boolean": $r = ($field) ? "true" : "false"; break; //Тип boolean
case "string": //если тип строковой
$p_function = "/^[a-zA-Z_]+\((.)*\)/"; //Шаблон на функцию
preg_match($p_function, $field,$mathes); //Поиск соврадений на функцию
if (isset($mathes[0])){ //Совпадения есть, это функция
$p_value = "/\((.+)\)/"; //Шаблон для выборки значения функции
preg_match($p_value, $field,$mValue); //Выборка значений
if (isset($mValue[0]) && !empty($mValue[0])){ //Если данные между скобок существуют и не пустые
$pv = trim($mValue[0],"()"); //Убираем скобки по концам
$pv = "'".self::escape($pv)."'"; //Экранируем то что в скобках
$r = preg_replace($p_value, "($pv)" , $field); //Меняем под функцию
}
else $r = $field; //Возвращаем функцию без параметров
}
else $r = "'".self::escape($field)."'"; //Если просто строка экранируем
break;
default: $r = "'".self::escape($field)."'"; break; //По умолчанию экранируем
}
return $r; //Возвращаем результат
}


Функция определяет когда текст должен быть в одинарных кавычках, а когда без.



А что если нужно добавить экземпляр в базу данных. Создать его можно как экземпляр класса выполнив код:

       $auth = new authors();
$auth->Name = "Тургеньев Иван Сергеевич";
$auth->Year = "1918-1983";
$auth->Add();




Код функции добавления представлен ниже:

	public function Add(){									//Добавляем объект - INSERT
$query = "INSERT INTO `".get_called_class()."` ("; //Подготавливаем запрос
$columns = self::_getVars(); //Получем колонки
$q_column = array(); //Массив полей для вставки
$q_data = array(); //Массив данных для вставки
foreach ($columns as $k => $v){ //Пробегаемся по столбцам
$q_column[] = "`".$k."`"; //Обертываем в кавычки
$q_data[] = self::RenderField($this->$k); //Рендерим обертку для данных
}
$query .= join(", ",$q_column).") VALUES ("; //Дополняем запрос столбцами
$query .= join(", ",$q_data).")"; //Дополняем запрос данными
$result = self::$db->query($query); //Делаем запрос
$insert_id = self::$db->insert_id; //Получаем идентификатор вставки
self::$stack->push($query." [".($result ? $insert_id : self::getError())."]"); //Стек результатов
return ($result) ? $insert_id : false; //Возвращаем ответ
}




Удаление объекта



Ну и напоследок удаление. В php нет функции delete и мы не будем нарушать традиции, поэтому назовем метод Remove();

Чтобы удалить запись автора из предыдущих примеров, необходимо выполнить код:

        $auth = authors::findID(2);
$auth->Remove();


Выбираем экземпляр и удаляем. Все очень просто и лаконично! Код функции для удаления представлен ниже:

	public function Remove(){								//Удаляем объект - DELETE
$id = key(self::_getVars()); //Выбираем идентификатор
if (!empty($this->$id)){ //Если идентификатор не пустой
$qDel = "DELETE FROM `".get_called_class()."` WHERE `$id` = ".$this->$id." LIMIT 1";
$rDel = self::$db->query($qDel); //Запрос на удаление
self::$stack->push($qDel." [".($rDel ? "TRUE" : self::getError())."]"); //Стек результатов
return $rDel ? true:false; //Возвращаем ответ
} else return false; //Отрицательный ответ
}




Данная ORM библиотека не является монстром современного мира, тем более писать я ее только начал, но вполне подходит для использования в небольших проектах. В следующей будет рассмотрено автоматическое генерирование модели базы данных.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/305786/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Технозавтрак «Эффективная работа с Percona Server for MySQL на высоконагруженных веб-кластерных проектах»

Понедельник, 11 Июля 2016 г. 16:51 (ссылка)





1. Мы в Битриксе очень любим делиться знаниями.

2. Мы любим использовать Percona Server вместо стандартного MySQL.

3. Иногда мы проводим бизнес-завтраки.



Соединив все эти факты вместе, мы решили провести техно-завтрак. :) Специальный гость — Петр Зайцев, директор Percona.



Все желающие совершенно бесплатно могут участвовать в онлайне — смотреть, задавать вопросы. Регистрируйтесь и отмечайте у себя в календарях 13 июля. :)



Подробности — под катом.



Ключевая тема мероприятия — нюансы использования MySQL / Percona в высоконагруженных проектах.



О чем будем говорить:



— Максимальная производительность и отказоустойчивость БД.

— Особенности решений Percona для оптимизации работы вашей БД.

— Использование master-master репликации для построения геораспределенного отказоустойчивого веб-кластера.

— Особенности работы Percona Server в облачной инфраструктуре.

— Как работать с тысячами баз на одном сервере.

— Расширенный мониторинг типичных и необычных характеристик БД.

— Практическое применение инструментов Percona Toolkit.



Отдельно расскажем о программе миграции решений «1С-Битрикс» с MSSQL и ORACLE Database на MySQL.



Если у вас уже сейчас есть вопросы и темы, которые вы хотели бы обсудить, пишите в комментариях.



13 июля. 10:00. Регистрируйтесь и участвуйте!

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/305424/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Вариант развёртывания Linux систем на базе Puppet 4. Часть V: базы данных (cfdb)

Четверг, 07 Июля 2016 г. 15:04 (ссылка)

cfdb use cases



Вкратце:




  1. cfdb — модуль развёртывания и автонастройки узлов и кластеров баз данных и доступа к ним с высокой доступностью и защитой от сбоев.

  2. Как proof-of-concept поддерживаются MySQL и PostgreSQL на базе Percona Server/XtraDB Cluster и официальных сборок PostgreSQL+repmgr.

  3. Изоляция ресурсов на базе cgroups, интеграция с настройками сетевого фильтра через модуль cfnetwork и строгий контроль доступа средствами СУБД.

  4. Запись на один узел для минимизации конфликтов и распределение нагрузки для read-only доступа.

  5. Автоматическая проверка здоровья кластера и фактической осуществимости доступа.

  6. Ручное и автоматическое локальное резервное копирование, автоматизированное восстановление данных.

  7. Поддержка автоматической миграции уже существующих баз данных





Тематический цикл:





Введение в концепцию и терминологию



cfdb types



Типы сущностей в абстрактной конфигурации:




  • cluster — абстрактная именованная совокупность узлов СУБД, работающих как одно целое.

  • instance — физический узел, принадлежащий cluster.

  • database — именованная база данных, принадлежащая cluster.

  • role — учётная запись с доступом к определённой database. По умолчанию всегда существует одноимённая с database роль с полным доступом к соответствующей базе.

  • access — декларируется необходимость доступа к определённой базе под определённой учётной записью базы с определённым максимальным числом соединений из указанной локальной учётной записи конкретного узла.



Специфика конфигурации кластера в некоторой степени продиктована живой работой DBA — есть основной узел, через который вносятся все изменения. По этому принципу сущности типа database и role допускается задавать только на одном узле, а остальные узлы должны быть сконфигурированны как второстепенные или вообще арбитраторы. Такое положение может добавить немного дискомфорта, если требуется вносить изменения во время fail-over, но ничто не ограничивает возможность временных ручных изменений.



Для унификации и упрощения отладки инфраструктуры прозрачно используется универсальный прокси-сервис HAProxy. Явное преимущество заключается: в отсутствии специальных изменений в приложениях, в продвинутом контроле статуса полностью готовых к работе узлов кластера, создании защищённых каналов связи вне процесса СУБД (TLS offloading), поддержке сбора статистических данных из коробки, строгое ограничение количества допустимых соединений даже от кривых приложений. HAProxy автоматически вступает в игру в следующих случаях:




  • В cluster более одного узла и соответственно требуется контролировать статус каждого.

  • Декларация доступа access принудительно требует защищённый канал связи с удалённым узлом.

  • Факт cf_location клиентского и серверного узла не совпадают (разные ЦОД) и явно не указано небезопасное соединение для случая с VPN.



В отличии от резиновых "производительных" ресурсов (CPU, I/O), главная проблема возникает с распределением памяти. Для этого в модуле cfsystem был создан универсальный фреймворк для распределения памяти в системе по относительным весам (приоритетам) сервисов с учётом возможных минимальных и максимальных лимитов. Совокупность процессов каждого instance запускается в собственном cgroup срезе systemd. Помимо управления распределением ресурсов и лимитами вроде максимального количества файловых дескрипторов, systemd ещё и выступает в роли хранителя процесс и автоматически перезапускает любое нештатное падение. Для дискового пространства всё же подразумевается монтирование отдельных томов для максимальной изоляции и скорости.



Мета-информация данного модуля собирается и хранится в виде фактов Puppet, что требует некоторого понимания, что факты генерируются на целевой системе и загружается в PuppetDB в начале развёртывания. Т.е. требуется повторное развёртывание чтобы сохранить свежие факты после изменений. Автоконфигурация доступа, ограничения количества соединений и прочие нюансы конфигурируются именно из этих централизованно сохранённых фактах о всех управляемых системах. Здесь явно есть простор для улучшений и соответственный план, но пока так.



Ближе к делу



Данный модуль почти на столько же многогранен на сколько многогранна полноценная настройка СУБД.Частично прояснить функционал поможет документация по cfdb, но нагружать всем данную статью будет излишним.



Поднимим СУБД




  1. Добавляем конфигурацию системы с базой

    # Добавляем класс cfdb для подхвата настроек
    classes: [cfdb]
    # Собственно задаём узел кластера
    cfdb::instances:
    mysrv:
    type: mysql
    port: 3306
    databases:
    db1: {}
    db2:
    roles:
    ro:
    readonly: true
    custom:
    custom_grant: 'GRANT SELECT ON $database.* TO $user; GRANT SELECT ON mysql.* TO $user;'

  2. Развертываем два раза. Пока так — на втором шаге будут собраны необходимые факты для централизованной базы.



@db$ sudo /opt/puppetlabs/bin/puppet agent --test; sudo /opt/puppetlabs/bin/puppet agent --test


Попробуем разобраться что произошло:




  • Устанавливается полный список пакетов Percona Server

  • Мы создаём узел СУБД, принадлежащий абстрактному кластеру с уникальным именем mysrv

  • В кластере определеяем две базы данных db1 и db2

  • Автоматически создаются роли db1 и db2 с полным доступом к соответствующим базам

  • Дополнительно создаётся роль db2ro с доступом только на чтение к db2 и поддержкой распределения нагрузки по узлам

  • Дополнительно создаётся роль db2custom с абсолютно произвольными правами доступа. Обратите внимание на обязательное использование ключей подстановки $database и $user.

  • Все пароли генерируются случайным образом, но могут быть принудительно установлены.

  • В централизованной базе PuppetDB появляется информация о существующих кластерах, их узлах, базах данных и ролях.



Декларируем доступ к ролям кластера




  1. Добавляем конфигурацию системы с приложением

    # Добавляем класс cfdb для подхвата настроек
    classes: [cfdb]
    # Непосредственно декларация доступа
    cfdb::access:
    # название произвольное, но уникальное
    webapp_mysrv_db1:
    cluster: mysrv
    role: db1
    local_user: webapp
    max_connections: 100
    webapp_mysrv_db2ro:
    cluster: mysrv
    role: db2ro
    local_user: webapp
    max_connections: 500
    config_prefix: 'DBRO_'

  2. Развертываем два раза на клиентской системе. Должны появиться предупреждения о невозможности получить доступ при автоматических проверках.

    @web$ sudo /opt/puppetlabs/bin/puppet agent --test; sudo /opt/puppetlabs/bin/puppet agent --test

  3. Развёртываем один раз на системе с базой

    @db$ sudo /opt/puppetlabs/bin/puppet agent --test

  4. При необходимости перегружаем СУБД для увеличения максимального количество всех соединений, которые кратны 100 по умолчанию. Процесс оазвёртывания сам подскажет необходимые действия.

    @db$ sudo /bin/systemctl restart cfmysql-mysrv.service

  5. Финальный этап — развёртываем ещё раз на клиентской системе чтобы убедиться, что все доступы работают.

    @db$ sudo /opt/puppetlabs/bin/puppet agent --test



Что же произошло:




  • На клиентской системе под локальным пользователем webapp был создан файл .env:


    • в нём набор переменных с префиксом DB_ (по умолчанию) для доступа к роли db1 одноимённой с базой,

    • плюс набор переменных с префиксом DBRO_ для доступа к роли db2ro в базе db2,

    • при желании кроме .env может использоваться любой специфичный подход (см. cfdb::access::custom_config).


  • На втором проходе загружаем факты.

  • Потом обновляем конфигурацию СУБД, где для каждой роли добавится клиентский узел в список разрешённых и увеличится максимальное количество соединений.

  • Проверяем, что все доступы работают — делается автоматически при развёртывании



Вот собственно и всё, нет существенной разницы в типе СУБД. Всё однотипно.



Миграция существующих каталогов с данными



Для удобства перехода с ранее установленных конфигураций СУБД была добавлена фича в виде init_db_from параметра тонкой настройки. Формат значения несколько отличается для разных типов СУБД ввиду специфики upgrade процессов. Пример использования:



cfdb::instances:
mymigrate:
type: mysql
...
settings_tune:
cfdb:
init_db_from: '/var/lib/mysql'
pgmigrate:
type: postgresql
...
settings_tune:
cfdb:
init_db_from: '9.5:/var/lib/postgresql/9.5/main/'


К слову, обновлённый модуль cfpuppetserver уже использует cfdb для организации высокой доступности. Во время установки происходит миграция базы фактов без потери мета-информации.



Выполняем ручные операции над instance



По умолчанию, домашние папки имеют вид /db/{type}_{name}/, где расположен каталог bin/ с полезным обёртками стандартных команд mysql, psql, repmgr и др. с префиксом cfdb_. Их можно запускать от пользователя root, но это небезопасно ввиду возможной подмены через расширения того же PostgreSQL. Пример входа в базу под супер-пользователем:



@db$ sudo -u mysql_mysrv /db/mysql_mysrv/bin/cfdb_mysql
# ИЛИ с некоторым риском
@db$ /db/mysql_mysrv/bin/cfdb_mysql


Резервное копирование и восстановление



Возможность ручного резервного копирования и восстановления всегда доступна через команды ~/bin/cfdb_backup и ~/bin/cfdb_restore в домашней папке instance. Автоматическое периодическое резервное копирование включается при $cfdb::instance::backup = true. Настройка производится через параметр $cfdb::instance::backup_tune. Специфика реализации зависит от типа СУБД. В данный момент xtrabackup используется для MySQL и pg_backup_ctl для PostgreSQL.



Примечание: в XB 2.4 есть проблема — требует минимум 1GB свободной памяти для инкрементального восстановления



Для примера поднимим hot standby кластер PostgreSQL с repmgr




  1. Конфигурация главного узла

    classes: [cfdb]
    cfdb::instances:
    pgcluster:
    type: postgresql
    port: 5432
    # Всё отличие
    is_cluster: true
    databases:
    - db1

  2. Конфигурация второстепенных узлов

    classes: [cfdb]
    cfdb::instances:
    pgcluster:
    type: postgresql
    port: 5432
    # этого достаточно для второстепенных узлов
    is_secondary: true

  3. Клиент конфигурируется точно так же, как и с одним узлом, но в игру автоматически прозрачно вступает HAProxy.




  4. Развёртываем на всех связанных системах. Повторяем ещё два раза: на первом шаге вносим факты в PuppetDB, а на втором доводим до ума. На третьем повторе уже не должно быть изменений. *Если требуется перезапустить некоторые узлы кластера, то в случае repmgr нужно это делать, начиная с ведущего (~/bin/cfdb_repmgr cluster show), в силу специфики параметра max_connections и репликации.



Кто хоть раз настраивал типовой кластер PostgreSQL с repmgr, почувствовали разницу?



Интеграция с контейнерами вроде Docker и внешней инфраструктурой



Тут есть две стороны: первая — сами СУБД, вторая — условно клиенты СУБД. В статичном варианте проблем особо быть не должно, а вот при динамическом наращивании требуется изначально развернуть максимальную инфраструктуру, а потом убрать лишнее с graceful отключением узлов кластера для сохранения кворума.



В случае "неуправляемых" внешних клиентов есть параметр $cfdb::role::static_access, который позволяет гибко задавать факты о декларированном доступе вручную в обход централизованных мета-данных.



Что мы имеем в итоге



Очевидно, что подобный подход позволяет "клепать" и поддерживать кластеры баз данных в промышленных масштабах за короткое время, значительно уменьшая риск ошибок в столь чувствительной области. Безусловно, в данный момент занесение мета-данных инфраструктуры в централизованную базу несколько усложняет процесс развёртывания. На определённом этапе есть возможность улучшить это, сразу учитывая ещё не развёрнутые части, но всему своё время. В то же время, данный модуль Puppet позволяет минимальными усилиями получить защищённую и относительно оптимально подогнанную к конкретным условиям СУБД, с крайне гибкой возможностью контроля как процесса оптимизации, так и подгонки финального конфига. Общая концепция универсальна и позволяет без особого труда добавлять поддержку других типов СУБД по мере необходимости.



При всём при этом сохранность данных стоит на первом месте — автоматизация имеет жёсткие ограничения, если появляется риск потери данных, тогда необходимо ручное вмешательство по подсказкам при развёртывании.



UPD: подправлены глюки обработки Markdown на Хабре.


Original source: habrahabr.ru.

https://habrahabr.ru/post/305108/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NetFact

PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) » NetFact.Ru: Скачать бесплатно – Популярная Интернет Библиотека

Вторник, 05 Июля 2016 г. 17:06 (ссылка)
netfact.ru/videotech/2085-p...-2015.html


PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015)




PHP, как средство создания Веб-сайтов необычайно популярно в России и в мире. Около 75% сайтов в мире написаны на PHP. С помощью PHP веб-мастера разрабатывают сложные сайты, имеющие развитые функции, активно взаимодействующие с пользователем. На курсе рассматриваются наиболее свежие версии PHP. Курс «PHP» от Центра «Специалист» максимально ориентированы на достижение реальных практических результатов. В деталях описано, как создать на РНР свою гостевую книгу, чат, форум, почтовую рассылку на сайте, новостную ленту и даже Интернет-магазин.



Отдельно рассмотрена методика создания системы автоматического управления содержимым сайта ("движка"). Такая система позволит слушателям максимально упростить поддержку и обновление своего сайта. Кроме создания своих скриптов, приведено описание профессиональных продуктов (бесплатных и открытых): форума РНРВВ и системы PHP-Nuke. Эти продукты применяются на огромном количестве сайтов и позволяют "дважды не изобретать велосипед", а использовать уже готовые решения.



Обучение PHP отличается простотой и ясностью изложения материала, благодаря опытным и известным преподавателям-гуру в области PHP.



По окончании курса «PHP. Уровень 1. Основы создания сайтов» Вы будете уметь:

• Использовать «сборку» Open Server c предустановленными веб-сервером Apache и PHP

• Уметь использовать основные настройки сервера Apache

• Настраивать PHP

• Создавать простые сценарии PHP

• Работать с формами: принимать данные HTML форм и обрабатывать их



По окончании курса «PHP. Уровень 2. Разработка web - сайтов и взаимодействие с MySQL» Вы будете уметь:

• Использовать особенности куки и заголовки HTTP для управления браузером

• Управлять сессиями пользователя

• Работать с файловой системой

• Устанавливать и настраивать для работы с PHP сервер MySQL

• Использовать различные модули для работы с сервером MySQL

• Создавать эффективные и быстрые сайты, использующие сервер MySQL



По окончании курса «PHP. Уровень 3. Профессиональная разработка на PHP5» Вы будете уметь:

• Использовать объектно-ориентированное программирование в PHP

• Использовать базы данных SQLite

• Использовать SimpleXML и DOM разбор XML документов в PHP

• Использовать XSLT преобразования в PHP

• Создавать и использовать XML Web сервисы с помощью протоколов SOAP и XML-RPC

• Использовать сокеты

• Использовать графический модуль GD2



Программа курса «PHP. Уровень 1. Основы создания сайтов»:

- Продолжительность: 12:13:43

Курс предназначен для слушателей, начинающих изучение PHP, и не имеющих опыта использования PHP. На этом курсе слушатели получают начальные навыки разработки сайтов на PHP, что позволяет быстро начать использование PHP. Курс прежде всего предназначен для слушателей, ранее не имевших дело с PHP-программированием, и желающих начать использование PHP. Данный курс является первым курсом в цепочке подготовки Веб-мастера к получению сертификации ZCE (Zend Certified Engineer).



Уровень 1

Модуль 1. Установка/настройка веб-сервера и PHP

• Вопросы, на которые надо ответить

• Как это работает?

• Установка веб-сервера

• Настройка веб-сервера

• Установка PHP

• Настройка PHP

• Первый скрипт на PHP



Модуль 2. Основы PHP

• Синтаксис

• Операторы

• Переменные

• Константы

• Типы

• Управляющие конструкции

• Лабораторная работа



Модуль 3. Циклы

• Операторы инкремента/декремента

• Цикл for

• Цикл while

• Цикл do-while

• Итерирование массива

• Цикл foreach

• Лабораторная работа



Модуль 4. Пользовательские функции

• Описание функции

• Вызов функции

• Аргументы функции

• Аргументы функции по умолчанию

• Область видимости переменных

• Статические переменные

• Возврат значений

• Рекурсивная функция

• Лабораторная работа



Модуль 5. Что внутри PHP?

• Документация PHP

• Обзор встроенных функции

• Математические функции

• Функции для работы с переменными

• Функции обработки строк

• Функции для работы с массивами

• Функции даты и времени

• Встроенные константы

• Суперглобальные переменные

• Функции эмуляции SSI

• Лабораторная работа



Модуль 6. Изучаем HTTP: формы

• HTTP/1.1

• Заголовки запроса и ответа

• Статус сервера

• Доступ к заголовкам запроса – переменные окружения сервера

• Работа с веб-формами

• Методы GET и POST

• Различие методов

• Проверка передаваемых значений

• Лабораторная работа

• Финальная практическая работа







PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015)








Программа курса «PHP. Уровень 2. Разработка web - сайтов и взаимодействие с MySQL

- Продолжительность: 10:29:12

На этом курсе слушатели продолжают знакомится с PHP, и этот курс охватывает все необходимые темы для создания сложных сайтов: управление сессиями пользователя и файловой системой, работа с базами данных, работа с протоколом HTTP. Данный курс является рекомендованным курсом в цепочке подготовки Веб-мастера к получению сертификации ZCE (Zend Certified Engineer). Курс рекомендован слушателям, имеющим начальный опыт использования PHP, и желающим расширить свои знания и опыт. На курсе рассматриваются наиболее свежие версии PHP



Уровень 2

Модуль 1. Cookie

• Что такое Cookie?

• Параметры cookie

• Типы cookie

• Временные

• Постоянные

• Создание cookie

• Чтение cookie

• Удаление cookie

• Сохранение массивов в cookie

• Лабораторная работа



Модуль 2. HTTP-заголовки ответа сервера

• Метод HEAD

• Заголовки ответа сервера

• Переадресация (Location)

• Перезапрос ресурса (Refresh)

• Установка типа содержимого (Content-Type)

• Управление кэшированием (Cache-Control, Expires)

• Буферизация

• Хэширование

• HTTP-аутентификация



Модуль 3. Сессии

• Что такое сессия?

• Создание сессии

• Чтение сессии

• Удаление сессии

• Параметры сессии

• Лабораторная работа



Модуль 4. Работа с файловой системой

• Функции для работы с файлами

• Режимы работы

• Чтение и запись

• Работа с курсором

• Прямая работа с файлами

• Запирание файлов

• Функции для работы с директориями

• Загрузка файлов на сервер по HTTP

• Лабораторная работа



Модуль 5. Как отправить email?

• Настройки для работы с почтой

• Принципы работы с почтой

• Параметры

• Лабораторная работа



Модуль 6. Основы работы с базами данных

• Общие сведения о базах данных

• Требования к структуре базы данных

• Реляционная СУБД

• Нормализация

• Общие сведения о SQL

• SELECT

• INSERT

• DELETE

• UPDATE

• Создание базы данных и таблицы



Модуль 7. Сервер баз данных MySQL

• Общие сведения о сервере баз данных MySQL

• Установка сервера баз данных MySQL

• Конфигурация сервера баз данных MySQL

• Программы для работы с сервером баз данных MySQL

• Использование утилит командной строки

• Экспорт и импорт баз данных

• Лабораторная работа



Модуль 8. Использование сервера баз данных MySQL в приложениях PHP

• Расширение MySQLi

• Соединение с сервером баз данных MySQL

• Выбор базы данных

• Исполнение запроса

• Получение результата запроса

• Полезные функции

• Опасность SQL-иньекций

• Подготовленные запросы

• Обзор расширения MySQL (обзорно)

• Лабораторная работа



Модуль 9. Практическая работа: создание интернет-магазина

• Создание базы данных

• Создание каталога товаров

• Выборка товаров из каталога

• Создание корзины пользователя

• Выборка товаров из корзины пользователя

• Удаление товаров из корзины пользователя

• Формирование заказа

• Выборка заказов

• Повышение безопасности (если останется время)







PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015)








Программа курса «Уровень 3. Профессиональная разработка на PHP5»:

- Продолжительность: 13:34:54

Данный курс является обязательным курсом в цепочке подготовки Веб-мастера к получению сертификации ZCE (Zend Certified Engineer). Курс рекомендован слушателям, имеющим начальный опыт использования PHP, и желающим расширить свои знания и опыт. В этом курсе рассматриваются сложные темы, такие как ООП, XML, Веб-сервисы, без которых немыслима профессиональная разработка приложений на PHP, что позволяет создавать сложные Интернет сайты, интегрированные с внешними данными.



Уровень 3

Модуль 1. Объектно-ориентированное программирование на PHP

• ООП в PHP - введение

• Классы

• Свойства и методы

• Конструкторы и деструкторы

• Клонирование объектов

• Наследование

• Перегрузка методов

• Методы доступа к свойствам и методам

• Обработка исключений

• Константы класса

• Абстрактные классы и методы

• Интерфейсы

• Финальные классы и методы

• Статические свойства и методы класса

• "Магические методы"

• Уточнение типа (type-hint)

• Типажи (traits)

• Другие полезные мелочи

• Лабораторные работы



Модуль 2. Практическое использование ООП с базой данных SQLite

• Введение в SQLite

• Преимущества и ограничения SQLite

• Особенности SQLite

• Выполнение основных операций работы с SQLite :

• создание базы и таблиц,

• вставка, обновление, удаление

• выборка данных

• Лабораторные работы



Модуль 3. PHP и XML

• Введение в XML

• Обзор возможностей по работе PHP с технологией XML

• SAX

• DOM

• SimpleXML

• XMLReader и XMLWriter

• Обзор XSL/T

• Преобразование данных на сервере

• Лабораторные работы



Модуль 4. PHP и XML Web-services

• Введение в XML Web-services

• Обзор RPC

• Обзор SOAP

• Использование расширения SOAP

• Использование WSDL

• Обзор XML-RPC

• Использование расширения XML-RPC

• Использование контекста потока

• Лабораторные работы



Модуль 5. Сокеты и сетевые функции

• Соединение с удаленными узлами через сокеты

• Сетевые функции

• Лабораторная работа



Модуль 6. Работа с графикой

• Введение в графические форматы

• Вопросы генерации графики на PHP 5

• Использование расширения GD2

• Базовые функции для работы с графикой

• Лабораторная работа







PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015) PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015)








Информация о видеокурсе

Название: PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5

Год выхода: 2015

Автор (режиссер): Специалист

Преподаватель: И. Борисов

Жанр: Обучающий, Программирование, PHP

Общая продолжительность: 36:17:49

Язык: Русский



Файл

Формат видео: MP4

Качество видео: PCRec

Видео: AVC, 1024x768, ~446 Kbps, 10.000 fps

Аудио: AAC, 96 Kbps, 44.1 KHz

Доп. материалы: присутствуют (исходники, лаб. работы и т. д)

Размер архива: 4,69 GB



Скачать: PHP. Уровень 1-3. Основы создания сайтов / Разработка web - сайтов и взаимодействие с MySQL / Профессиональная разработка на PHP5 (2015)



Скачать | Download | TurboBit.net

http://turbobit.net/n4aax37cwzyc/PHP.Uroven_1-3.rar.html



Скачать | Download | HitFile.net

http://www.hitfile.net/O7Lc1eM/PHP.Uroven_1-3.rar.html



Скачать | Download | Файлообменник.рф

http://файлообменник.рф/ljvcmc1j4g85/PHP.Uroven_1-3.rar.html

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<mysql - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda