Segui as dicas do @RolandoMySQLDBA neste tópico: mysql, alterando tabelas de myisam para ndb Mas não obtive sucesso na última etapa.
Eu tenho um problema semelhante, aqui está minha tabela original:
CREATE TABLE `df_modules_metadata_values` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`date_added` datetime NOT NULL,
`date_modified` datetime DEFAULT NULL,
`uid` mediumint(9) NOT NULL,
`share_id` mediumint(9) DEFAULT NULL,
`file_id` mediumint(9) NOT NULL,
`field_id` mediumint(9) NOT NULL,
`val` text CHARACTER SET utf8,
PRIMARY KEY (`id`),
KEY `date_added` (`date_added`),
KEY `uid` (`uid`,`file_id`,`field_id`),
KEY `file_id` (`file_id`,`field_id`),
KEY `uid_2` (`uid`,`field_id`),
KEY `val` (`val`(100)),
KEY `field_id` (`field_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Se eu simplesmente convertê-lo, ele me dará este erro:
mysql> alter table df_modules_metadata_values engine=ndbcluster;
ERROR 1073 (42000): BLOB column 'val' can't be used in key specification with the used table type
Aqui está o que eu tentei:
mysql> show table status where name='df_modules_metadata_values';
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| df_modules_metadata_values | MyISAM | 10 | Dynamic | 0 | 0 | 0 | 281474976710655 | 2048 | 0 | 1 | 2017-09-10 18:00:21 | 2017-09-10 18:00:21 | NULL | utf8_unicode_ci | NULL | | |
+----------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)
mysql> alter table df_modules_metadata_values rename df_modules_metadata_values_old;
Query OK, 0 rows affected (0.00 sec)
mysql> create table df_modules_metadata_values select * from df_modules_metadata_values_old where 1=2;
Query OK, 0 rows affected, 1 warning (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> alter table df_modules_metadata_values add column val100 char(100) after val;
Query OK, 0 rows affected, 1 warning (0.39 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> alter table df_modules_metadata_values add unique index (val100);
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table df_modules_metadata_values engine=ndbcluster;
Query OK, 0 rows affected, 1 warning (0.49 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show table status where name='df_modules_metadata_values';
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
| df_modules_metadata_values | ndbcluster | 10 | Dynamic | 0 | 0 | 0 | 0 | 0 | 0 | NULL | NULL | NULL | NULL | latin1_swedish_ci | NULL | partitioned | |
+----------------------------+------------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.00 sec)
Agora tenho dificuldade para finalizar sua última etapa, não consigo entender o significado delas, como finalizar a etapa "inserir em"? E por que precisamos fazer isso?
Além disso, durante minhas operações, pude ver alguns avisos, como posso verificá-los?
Obrigado!
Depois de ver
Warnings: 1
, façaSHOW WARNINGS;
; pode haver algo importante.Livrar-se de
KEY (val(100))
; é praticamente inútil de qualquer maneira. Se você não precisar do tamanho total deTEXT
, faça-o razoavelmente curtoVARCHAR
, então tenhaKEY (val)
, senão livre-se do índice completamente.A conversão para InnoDB é mais fácil do que para NDB. E você pode obter HA com ele.
Como a questão parece ser sobre como fazer configurações de alta disponibilidade, eu recomendo (em vez de NDB) que você vá com "InnoDB Cluster" e "Group Replication". (Leia sobre eles no manual online para 5.7.)
Isso exigirá a conversão para InnoDB em todas as suas tabelas e que elas tenham uma extensão
PRIMARY KEY
.Isso discute ainda a conversão de MyISAM para InnoDB.