AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 95740
Accepted
Mark Hansen
Mark Hansen
Asked: 2015-03-20 14:36:32 +0800 CST2015-03-20 14:36:32 +0800 CST 2015-03-20 14:36:32 +0800 CST

ALTER coluna de chave primária de INT para BIGINT em produção (MySQL 5.6.19a)

  • 772

Algumas tabelas INNODB em nosso banco de dados de produção estão prestes a atingir o limite INT AUTO_INCREMENT de 2147483647 e precisamos alterá-las para BIGINT, caso contrário as gravações começarão a falhar.

As tabelas estão em um banco de dados MySQL 5.6.19a de produção em execução no Amazon RDS.

Como podemos fazer um ALTER assim sem atrapalhar as leituras e inserções de produção que estão acontecendo o tempo todo?

ALTER TABLE MYTABLECHANGE id idBIGINT NOT NULL AUTO_INCREMENT;

Aqui está o DDL para a tabela:

CREATE TABLE `MYTABLE` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `siteId` int(11) NOT NULL,
  `filter` varchar(10) NOT NULL DEFAULT 'ALL',
  `date` varchar(10) NOT NULL,
  `cards` varchar(250) NOT NULL,
  `apples` varchar(45) NOT NULL,
  `carrots` varchar(45) NOT NULL,
  `corn` varchar(45) NOT NULL,
  `peas` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
  KEY `date_k` (`date`),
  KEY `cards_k` (`cards`),
  KEY `apples_k` (`apples`),
  KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8
mysql innodb
  • 3 3 respostas
  • 51079 Views

3 respostas

  • Voted
  1. Best Answer
    kriegu
    2015-03-21T11:06:28+08:002015-03-21T11:06:28+08:00

    Se você tiver espaço suficiente, poderá criar uma cópia da tabela real e fazer o trabalho nela:

    CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;
    

    Em seguida, você pode alterar a coluna conforme desejado:

    ALTER TABLE tbl_name MODIFY COLUMN col_name BIGINT AUTO_INCREMENT;
    

    Depois que o processo estiver concluído, você poderá renomear as tabelas:

    RENAME TABLE tbl_name TO new_tbl_name, tbl_name2 TO new_tbl_name2;
    

    Em seguida, solte a tabela original e você deverá ter o resultado esperado.

    • 26
  2. Maze
    2015-09-02T05:23:16+08:002015-09-02T05:23:16+08:00

    O kit de ferramentas percona é o caminho a percorrer, pelo menos se você não tiver muito tempo. A conversão levou em nossa mesa (500Gb, configuração master-slave) quando testamos um pouco mais de 24h, em produção levou (com hardware melhor) quase 1 mês (sidenote engraçado que tínhamos cerca de 30 dias antes de ficarmos sem ids, portanto já começamos a planejar o plano B e C, trabalhando com backups offline, removendo slaves,... ). O atraso foi principalmente devido à espera da replicação acontecendo para os escravos (permitimos um atraso máximo de 50 segundos). Certifique-se também de limitar o número de threads simultâneos. Temos mais de 2 milhões de inserções/dia e muitos milhões de leituras.

    Também esteja ciente de que, uma vez iniciada a cobertura, você não pode pará-la (ou pelo menos não encontramos nenhuma maneira de reiniciá-la) :-(

    • 5
  3. Rick James
    2015-03-20T15:13:51+08:002015-03-20T15:13:51+08:00

    Nós iremos....

    KEY TOP_QUERIES_LAST_30DAYS_fk (siteId) é redundante com a CHAVE PRIMÁRIA, então você também pode SOLTAR.

    INT UNSIGNED levaria você a 4 bilhões, será suficiente?

    Considere mudar filterpara um ENUM.

    Você tem 1,75 bilhão de linhas? Ou você "queimou" muitos ids? Se sim, talvez possamos consertar isso? Por exemplo REPLACEe certos sabores de INSERTids de lance de vontade. INSERT...ON DUPLICATE KEYgeralmente pode substituir REPLACE. Um processo de 2 etapas pode evitar INSERT IGNOREa queima de ids.

    Voltando à pergunta...

    Veja se pt-online-schema-change fará o truque: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve