Перенос MyISAM в InnoDB

Процесс переноса из одно системы хранения (MyISAM) в другую (InnoDB) MySQL может состоять из одного только запроса и это было бы идеально, но не все так просто.

Условие № 1

Все таблицы в MyISAM перед конвертацией должны быть с первичными ключами (Primary key)

Условие № 2

В таблицах не должно быть дефолтных нулевых значений или как лайфхак можно применить две команды на сервере MySQL, куда мы конвертируем базу:
mysql> SET GLOBAL SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
mysql> SET SQL_MODE='ALLOW_INVALID_DATES';

Условие № 3
перед переносом сконвертированных баз с InnoDB во время экспорта нужно обязательно добавить два ключа:
--lock-tables=FALSE --add-locks=FALSE

п.ч. Persona Cluster не сможет симпортировать базу, в исходнике которой есть блокировка таблиц.


Перенос баз с MyISAM в Persona Cluster
Здесь будет несколько этапов.

1) Дамп боевых баз в локальную виртуалку

есть готовый список команд для дампа; приведу только первые две:
mysqladmin -u root -pvnfhry46 create cloudsmetaru & \
mysqldump --column-statistics=0 -u root -h 192.168.100.72 -P7003 -pyourpass --opt -R cloudsmetaru \
 | mysql -u root -pyourpass -hlocalhost cloudsmetaru

mysqladmin -u root -pvnfhry46 create dealersmetaru & \
mysqldump --column-statistics=0 -u root -h 192.168.100.72 -P7003 -pyourpass --opt -R dealersmetaru \
 | mysql -u root -pyourpass -hlocalhost dealersmetaru

2) Конвертирование баз в локальной виртуалке

Для автоматизации процесса я создал два скрипта.
Первый конверирует MyISAM в InnoDB и на входе принимает в качестве параметра имя базы:

#!/bin/bash

echo "Converting tables for database $1"

for table in `mysql -uroot -pvnfhry46 -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '$1' AND engine = 'MyISAM'"`
do
echo -n " Alter table table $table "
mysql -uroot -pvnfhry46 -N -e "ALTER TABLE $1.$table ENGINE = InnoDB" $1
echo "done"
done

if [ "$table" = "" ]; then
echo "No tables found in $1"
else
echo "Converting completed"
fi

Второй скрипт из готового списка необходимых баз перебором запускает первый вышеуказанный bash-скрипт с именем базы в качестве одного единственного аргумента:

#!/bin/bash

declare -a BaseArray=("cloudsmetaru" \
"dealersmetaru" \
"freelansim" \
"helpsmetaru" \
"helpsmetaru10" \
"helpsmetaru7" \
"helpsmetaru8" \
"helpsmetaru9" \
"idsmeta" \
"internaldesk" \
"lepra" \
"ncssmeta" \
"osticket" \
"promobase" \
"servicedb" \
"smeta_ru" \
"spbsmetaru" \
"stat" \
"statistics" \
"stroysoft_sfor" \
"vk")

for val in "${BaseArray[@]}"; do
  echo $val
  ./toinnodb.sh $val && wait
done

3) Экспорт Innodb-баз

Как говорил ранее, нужно проверить наличие в каждой табличке наличие первичных ключей



(Можно воспользоваться готовым скриптом, к-й выведет все таблички без первичных ключей):

select tab.table_schema as database_name,
       tab.table_name
from information_schema.tables tab
left join information_schema.table_constraints tco
          on tab.table_schema = tco.table_schema
          and tab.table_name = tco.table_name
          and tco.constraint_type = 'PRIMARY KEY'
where tco.constraint_type is null
      and tab.table_schema not in('mysql', 'information_schema', 
                                  'performance_schema', 'sys')
      and tab.table_type = 'BASE TABLE'
--      and tab.table_schema = 'sakila' -- put schema name here
order by tab.table_schema,
         tab.table_name;



И снятые галочки блокировок таблиц



4) Импорт в Persona Cluster
Настраиваем коннект в workbench:



Выделяем нужную базу и импортируем



Вот, в принципе и все ;)

0 комментариев

Оставить комментарий

Имя:
E-Mail:
Введите код с картинки: