Safest way to add primary key to table

I created a table without a primary key and an UPDATE statement caused the cluster to lock up due to this issue https://www.percona.com/blog/2013/10/18/innodb-scalability-issues-tables-without-primary-keys/

My question is, what’s the best way to add a primary key to this table:

  1. Use an ALTER table statement.
  2. TRUNCATE table, then issue an ALTER statement to add the primary key and then INSERT rows.
  3. DROP table and then issue a CREATE table with a primary key then INSERT rows.

I don’t want to lock the cluster up again.

The table in questions has about 50k rows and is 10MB in size.

Could you just update with the versions and environment information?

We have a Percona XtraDB Cluster of 3 nodes, all running version 5.6.24. The OS on each node is CentOS 6, 4GB RAM, Intel® Xeon™ CPU 2.80GHz (dual core).

The result of a SHOW GLOBAL VARIABLES; statement is as follows (split over 2 posts):

Variable_name;Value
auto_increment_increment;3
auto_increment_offset;2
autocommit;ON
automatic_sp_privileges;ON
avoid_temporal_upgrade;OFF
back_log;80
basedir;/usr
big_tables;OFF
bind_address;*
binlog_cache_size;32768
binlog_checksum;CRC32
binlog_direct_non_transactional_updates;OFF
binlog_error_action;IGNORE_ERROR
binlog_format;ROW
binlog_gtid_simple_recovery;OFF
binlog_max_flush_queue_time;0
binlog_order_commits;ON
binlog_row_image;FULL
binlog_rows_query_log_events;OFF
binlog_stmt_cache_size;32768
binlogging_impossible_mode;IGNORE_ERROR
block_encryption_mode;aes-128-ecb
bulk_insert_buffer_size;8388608
character_set_client;latin1
character_set_connection;latin1
character_set_database;latin1
character_set_filesystem;binary
character_set_results;latin1
character_set_server;latin1
character_set_system;utf8
character_sets_dir;/usr/share/percona-xtradb-cluster/charsets/
collation_connection;latin1_swedish_ci
collation_database;latin1_swedish_ci
collation_server;latin1_swedish_ci
completion_type;NO_CHAIN
concurrent_insert;AUTO
connect_timeout;10
core_file;OFF
csv_mode;
datadir;/var/lib/mysql/
date_format;%Y-%m-%d
datetime_format;%Y-%m-%d %H:%i:%s
default_storage_engine;InnoDB
default_tmp_storage_engine;InnoDB
default_week_format;0
delay_key_write;ON
delayed_insert_limit;100
delayed_insert_timeout;300
delayed_queue_size;1000
disconnect_on_expired_password;ON
div_precision_increment;4
end_markers_in_json;OFF
enforce_gtid_consistency;ON
enforce_storage_engine;
eq_range_index_dive_limit;10
event_scheduler;OFF
expand_fast_index_creation;OFF
expire_logs_days;3
explicit_defaults_for_timestamp;OFF
extra_max_connections;1
extra_port;0
flush;OFF
flush_time;0
foreign_key_checks;ON
ft_boolean_syntax;+ -><()~*:""&|
ft_max_word_len;84
ft_min_word_len;4
ft_query_expansion_limit;20
ft_stopword_file;(built-in)
general_log;OFF
general_log_file;/var/lib/mysql/database01.log
group_concat_max_len;102400
gtid_deployment_step;OFF
gtid_executed;aecfffa4-55b2-ee1a-5417-31ed7d9e97c3:1-149104818,
eb55dadf-db4d-11e5-ae62-0011259dcb16:1-4193930
gtid_mode;ON
gtid_owned;aecfffa4-55b2-ee1a-5417-31ed7d9e97c3:61403833#14885144:61966645#15068932:61973098#15063624:62677904#15298043:61839513#15034335:61954783#15065496:61956753#15067169:62216955#15137921:61967200#15068932:61973079#15063624:61973095#15063624:61483418#14899277:61973112#15063624:61973114#15063624:61973680#15063624:62751587#15306881:62199223#15135974:62187813#15134559:62420886#15197500:61483772#14899277
gtid_purged;aecfffa4-55b2-ee1a-5417-31ed7d9e97c3:1-148608286,
eb55dadf-db4d-11e5-ae62-0011259dcb16:1-4193930
have_backup_locks;YES
have_compress;YES
have_crypt;YES
have_dynamic_loading;YES
have_geometry;YES
have_openssl;DISABLED
have_profiling;YES
have_query_cache;YES
have_rtree_keys;YES
have_snapshot_cloning;YES
have_ssl;DISABLED
have_statement_timeout;YES
have_symlink;DISABLED
host_cache_size;278
hostname;database01
ignore_builtin_innodb;OFF
ignore_db_dirs;
init_connect;
init_file;
init_slave;
innodb_adaptive_flushing;ON
innodb_adaptive_flushing_lwm;10
innodb_adaptive_hash_index;ON
innodb_adaptive_hash_index_partitions;1
innodb_adaptive_max_sleep_delay;150000
innodb_additional_mem_pool_size;8388608
innodb_api_bk_commit_interval;5
innodb_api_disable_rowlock;OFF
innodb_api_enable_binlog;OFF
innodb_api_enable_mdl;OFF
innodb_api_trx_level;0
innodb_autoextend_increment;64
innodb_autoinc_lock_mode;2
innodb_buffer_pool_dump_at_shutdown;OFF
innodb_buffer_pool_dump_now;OFF
innodb_buffer_pool_filename;ib_buffer_pool
innodb_buffer_pool_instances;1
innodb_buffer_pool_load_abort;OFF
innodb_buffer_pool_load_at_startup;OFF
innodb_buffer_pool_load_now;OFF
innodb_buffer_pool_populate;OFF
innodb_buffer_pool_size;1310720000
innodb_change_buffer_max_size;25
innodb_change_buffering;all
innodb_checksum_algorithm;innodb
innodb_checksums;ON
innodb_cleaner_lsn_age_factor;high_checkpoint
innodb_cmp_per_index_enabled;OFF
innodb_commit_concurrency;0
innodb_compression_failure_threshold_pct;5
innodb_compression_level;6
innodb_compression_pad_pct_max;50
innodb_concurrency_tickets;5000
innodb_corrupt_table_action;assert
innodb_data_file_path;ibdata1:12M:autoextend
innodb_data_home_dir;
innodb_disable_sort_file_cache;OFF
innodb_disallow_writes;OFF
innodb_doublewrite;ON
innodb_empty_free_list_algorithm;backoff
innodb_fake_changes;OFF
innodb_fast_shutdown;1
innodb_file_format;Antelope
innodb_file_format_check;ON
innodb_file_format_max;Antelope
innodb_file_per_table;ON
innodb_flush_log_at_timeout;1
innodb_flush_log_at_trx_commit;1
innodb_flush_method;
innodb_flush_neighbors;1
innodb_flushing_avg_loops;30
innodb_force_load_corrupted;OFF
innodb_force_recovery;0
innodb_foreground_preflush;exponential_backoff
innodb_ft_aux_table;
innodb_ft_cache_size;8000000
innodb_ft_enable_diag_print;OFF
innodb_ft_enable_stopword;ON
innodb_ft_max_token_size;84
innodb_ft_min_token_size;3
innodb_ft_num_word_optimize;2000
innodb_ft_result_cache_limit;2000000000
innodb_ft_server_stopword_table;
innodb_ft_sort_pll_degree;2
innodb_ft_total_cache_size;640000000
innodb_ft_user_stopword_table;
innodb_io_capacity;200
innodb_io_capacity_max;2000
innodb_kill_idle_transaction;0
innodb_large_prefix;OFF
innodb_lock_wait_timeout;50
innodb_locking_fake_changes;ON
innodb_locks_unsafe_for_binlog;OFF
innodb_log_arch_dir;./
innodb_log_arch_expire_sec;0
innodb_log_archive;OFF
innodb_log_block_size;512
innodb_log_buffer_size;8388608
innodb_log_checksum_algorithm;innodb
innodb_log_compressed_pages;ON
innodb_log_file_size;50331648
innodb_log_files_in_group;2
innodb_log_group_home_dir;./
innodb_lru_scan_depth;1024
innodb_max_bitmap_file_size;104857600
innodb_max_changed_pages;1000000
innodb_max_dirty_pages_pct;75
innodb_max_dirty_pages_pct_lwm;0
innodb_max_purge_lag;0
innodb_max_purge_lag_delay;0
innodb_mirrored_log_groups;1
innodb_monitor_disable;
innodb_monitor_enable;
innodb_monitor_reset;
innodb_monitor_reset_all;
innodb_old_blocks_pct;37
innodb_old_blocks_time;1000
innodb_online_alter_log_max_size;134217728
innodb_open_files;2000
innodb_optimize_fulltext_only;OFF
innodb_page_size;16384
innodb_print_all_deadlocks;ON
innodb_purge_batch_size;300
innodb_purge_threads;1
innodb_random_read_ahead;OFF
innodb_read_ahead_threshold;56
innodb_read_io_threads;4
innodb_read_only;OFF
innodb_replication_delay;0
innodb_rollback_on_timeout;OFF
innodb_rollback_segments;128
innodb_sched_priority_cleaner;19
innodb_show_locks_held;10
innodb_show_verbose_locks;0
innodb_sort_buffer_size;1048576
innodb_spin_wait_delay;6
innodb_stats_auto_recalc;ON
innodb_stats_method;ulls_equal
innodb_stats_on_metadata;OFF
innodb_stats_persistent;ON
innodb_stats_persistent_sample_pages;20
innodb_stats_sample_pages;8
innodb_stats_transient_sample_pages;8
innodb_status_output;OFF
innodb_status_output_locks;OFF
innodb_strict_mode;OFF

innodb_support_xa;ON
innodb_sync_array_size;1
innodb_sync_spin_loops;30
innodb_table_locks;ON
innodb_thread_concurrency;0
innodb_thread_sleep_delay;10000
innodb_track_changed_pages;OFF
innodb_undo_directory;.
innodb_undo_logs;128
innodb_undo_tablespaces;0
innodb_use_atomic_writes;OFF
innodb_use_global_flush_log_at_trx_commit;ON
innodb_use_native_aio;ON
innodb_use_sys_malloc;ON
innodb_version;5.6.24-72.2
innodb_write_io_threads;4
interactive_timeout;28800
join_buffer_size;262144
keep_files_on_create;OFF
key_buffer_size;8388608
key_cache_age_threshold;300
key_cache_block_size;1024
key_cache_division_limit;100
large_files_support;ON
large_page_size;0
large_pages;OFF
lc_messages;en_US
lc_messages_dir;/usr/share/percona-xtradb-cluster/
lc_time_names;en_US
license;GPL
local_infile;ON
lock_wait_timeout;31536000
locked_in_memory;OFF
log_bin;ON
log_bin_basename;/var/lib/mysql/database01
log_bin_index;/var/lib/mysql/database01.index
log_bin_trust_function_creators;OFF
log_bin_use_v1_row_events;OFF
log_error;/var/log/mysqld.log
log_output;FILE
log_queries_not_using_indexes;OFF
log_slave_updates;ON
log_slow_admin_statements;OFF
log_slow_filter;
log_slow_rate_limit;1
log_slow_rate_type;session
log_slow_slave_statements;OFF
log_slow_sp_statements;ON
log_slow_verbosity;
log_throttle_queries_not_using_indexes;0
log_warnings;2
log_warnings_suppress;
long_query_time;5.000000
low_priority_updates;OFF
lower_case_file_system;OFF
lower_case_table_names;1
master_info_repository;FILE
master_verify_checksum;OFF
max_allowed_packet;4194304
max_binlog_cache_size;18446744073709547520
max_binlog_files;0
max_binlog_size;52428800
max_binlog_stmt_cache_size;18446744073709547520
max_connect_errors;100
max_connections;150
max_delayed_threads;20
max_digest_length;1024
max_error_count;64
max_heap_table_size;16777216
max_insert_delayed_threads;20
max_join_size;18446744073709551615
max_length_for_sort_data;1024
max_prepared_stmt_count;16382
max_relay_log_size;0
max_seeks_for_key;18446744073709551615
max_slowlog_files;0
max_slowlog_size;0
max_sort_length;1024
max_sp_recursion_depth;0
max_statement_time;0
max_tmp_tables;32
max_user_connections;0
max_write_lock_count;18446744073709551615
metadata_locks_cache_size;1024
metadata_locks_hash_instances;8
min_examined_row_limit;0
multi_range_count;256
myisam_data_pointer_size;6
myisam_max_sort_file_size;9223372036853727232
myisam_mmap_size;18446744073709551615
myisam_recover_options;OFF
myisam_repair_threads;1
myisam_sort_buffer_size;8388608
myisam_stats_method;ulls_unequal
myisam_use_mmap;OFF
net_buffer_length;16384
net_read_timeout;30
net_retry_count;10
net_write_timeout;60
new;OFF
old;OFF
old_alter_table;OFF
old_passwords;0
open_files_limit;5000
optimizer_prune_level;1
optimizer_search_depth;62
optimizer_switch;index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on
optimizer_trace;enabled=off,one_line=off
optimizer_trace_features;greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on
optimizer_trace_limit;1
optimizer_trace_max_mem_size;16384
optimizer_trace_offset;-1
performance_schema;ON
performance_schema_accounts_size;100
performance_schema_digests_size;10000
performance_schema_events_stages_history_long_size;10000
performance_schema_events_stages_history_size;10
performance_schema_events_statements_history_long_size;10000
performance_schema_events_statements_history_size;10
performance_schema_events_waits_history_long_size;10000
performance_schema_events_waits_history_size;10
performance_schema_hosts_size;100
performance_schema_max_cond_classes;80
performance_schema_max_cond_instances;3500
performance_schema_max_file_classes;50
performance_schema_max_file_handles;32768
performance_schema_max_file_instances;7693
performance_schema_max_mutex_classes;200
performance_schema_max_mutex_instances;16200
performance_schema_max_rwlock_classes;40
performance_schema_max_rwlock_instances;9100
performance_schema_max_socket_classes;10
performance_schema_max_socket_instances;320
performance_schema_max_stage_classes;150
performance_schema_max_statement_classes;179
performance_schema_max_table_handles;4000
performance_schema_max_table_instances;12500
performance_schema_max_thread_classes;50
performance_schema_max_thread_instances;400
performance_schema_session_connect_attrs_size;512
performance_schema_setup_actors_size;100
performance_schema_setup_objects_size;100
performance_schema_users_size;100
pid_file;/var/lib/mysql/database01.pid
plugin_dir;/usr/lib64/mysql/plugin/
port;3306
preload_buffer_size;32768
profiling;OFF
profiling_history_size;15
protocol_version;10
query_alloc_block_size;8192
query_cache_limit;1048576
query_cache_min_res_unit;4096
query_cache_size;1048576
query_cache_strip_comments;OFF
query_cache_type;OFF
query_cache_wlock_invalidate;OFF
query_prealloc_size;8192
range_alloc_block_size;4096
read_buffer_size;131072
read_only;OFF
read_rnd_buffer_size;262144
relay_log;
relay_log_basename;
relay_log_index;
relay_log_info_file;relay-log.info
relay_log_info_repository;FILE
relay_log_purge;ON
relay_log_recovery;OFF
relay_log_space_limit;0
report_host;
report_password;
report_port;3306
report_user;
rpl_stop_slave_timeout;31536000
secure_auth;ON
secure_file_priv;
server_id;1
server_id_bits;32
server_uuid;eb55dadf-db4d-11e5-ae62-0011259dcb16
sha256_password_private_key_path;private_key.pem
sha256_password_public_key_path;public_key.pem
show_old_temporals;OFF
simplified_binlog_gtid_recovery;OFF
skip_external_locking;ON
skip_name_resolve;ON
skip_networking;OFF
skip_show_database;OFF
slave_allow_batching;OFF
slave_checkpoint_group;512
slave_checkpoint_period;300
slave_compressed_protocol;OFF
slave_exec_mode;STRICT
slave_load_tmpdir;/tmp
slave_max_allowed_packet;1073741824
slave_net_timeout;3600
slave_parallel_workers;0
slave_pending_jobs_size_max;16777216
slave_rows_search_algorithms;TABLE_SCAN,INDEX_SCAN
slave_skip_errors;OFF
slave_sql_verify_checksum;ON
slave_transaction_retries;10
slave_type_conversions;
slow_launch_time;2
slow_query_log;ON
slow_query_log_always_write_time;10.000000
slow_query_log_file;/var/log/slow.log
slow_query_log_timestamp_always;OFF
slow_query_log_timestamp_precision;second
slow_query_log_use_global_control;
socket;/var/lib/mysql/mysql.sock
sort_buffer_size;262144
sql_auto_is_null;OFF
sql_big_selects;ON
sql_buffer_result;OFF
sql_log_bin;ON
sql_log_off;OFF
sql_mode;NO_ENGINE_SUBSTITUTION
sql_notes;ON
sql_quote_show_create;ON
sql_safe_updates;OFF
sql_select_limit;18446744073709551615
sql_slave_skip_counter;0
sql_warnings;OFF
ssl_ca;
ssl_capath;
ssl_cert;
ssl_cipher;
ssl_crl;
ssl_crlpath;
ssl_key;
storage_engine;InnoDB
stored_program_cache;256
super_read_only;OFF
sync_binlog;0
sync_frm;ON
sync_master_info;10000
sync_relay_log;10000
sync_relay_log_info;10000
system_time_zone;GMT
table_definition_cache;1400

table_open_cache;2000
table_open_cache_instances;1
thread_cache_size;9
thread_concurrency;10
thread_handling;one-thread-per-connection
thread_pool_high_prio_mode;transactions
thread_pool_high_prio_tickets;4294967295
thread_pool_idle_timeout;60
thread_pool_max_threads;100000
thread_pool_oversubscribe;3
thread_pool_size;4
thread_pool_stall_limit;500
thread_stack;262144
thread_statistics;OFF
time_format;%H:%i:%s
time_zone;SYSTEM
timed_mutexes;OFF
tmp_table_size;16777216
tmpdir;/tmp
transaction_alloc_block_size;8192
transaction_prealloc_size;4096
tx_isolation;REPEATABLE-READ
tx_read_only;OFF
unique_checks;ON
updatable_views_with_limit;YES
userstat;OFF
version;5.6.24-72.2-56-log
version_comment;Percona XtraDB Cluster (GPL), Release rel72.2, Revision 1, WSREP version 25.11, wsrep_25.11
version_compile_machine;x86_64
version_compile_os;Linux
wait_timeout;28800
wsrep_OSU_method;TOI
wsrep_auto_increment_control;ON
wsrep_causal_reads;OFF
wsrep_certify_nonPK;ON
wsrep_cluster_address;gcomm://[CLUSTER IP’S HERE]
wsrep_cluster_name;my_wsrep_cluster
wsrep_convert_LOCK_to_trx;OFF
wsrep_data_home_dir;/var/lib/mysql/
wsrep_dbug_option;
wsrep_debug;OFF
wsrep_desync;OFF
wsrep_drupal_282555_workaround;OFF
wsrep_forced_binlog_format;NONE
wsrep_load_data_splitting;ON
wsrep_log_conflicts;OFF
wsrep_max_ws_rows;131072
wsrep_max_ws_size;1073741824
wsrep_mysql_replication_bundle;0
wsrep_node_address;
wsrep_node_incoming_address;AUTO
wsrep_node_name;database01
wsrep_notify_cmd;
wsrep_on;ON
wsrep_preordered;OFF
wsrep_provider;/usr/lib64/libgalera_smm.so
wsrep_provider_options;base_dir = /var/lib/mysql/; base_host = [ip here]; base_port = 4567; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT15S; evs.info_log_mask = 0; evs.install_timeout = PT7.5S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT5S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; gcache.dir = /var/lib/mysql/; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /var/lib/mysql//galera.cache; gcache.page_size = 128M; gcache.size = 128M; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; gcs.recv_q_hard_limit = 9223372036854775807; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; gmcast.listen_addr = tcp://0.0.0.0:4567; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ist.recv_addr = [ip here]; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = P30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT30S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2;
wsrep_recover;OFF
wsrep_reject_queries;NONE
wsrep_replicate_myisam;OFF
wsrep_restart_slave;OFF
wsrep_retry_autocommit;1
wsrep_slave_FK_checks;ON
wsrep_slave_UK_checks;OFF
wsrep_slave_threads;1
wsrep_sst_auth;********
wsrep_sst_donor;
wsrep_sst_donor_rejects_queries;OFF
wsrep_sst_method;xtrabackup-v2
wsrep_sst_receive_address;AUTO
wsrep_start_position;5130005b-aa4d-11e5-abe8-ce128261683c:5420391
wsrep_sync_wait;0

  1. Yes. ALTER TABLE foo ADD PRIMARY KEY(existingColumn);
    You may need to add a new column if you do not already have a column that can be used as PRIMARY KEY. Simplest is to just add a INT UNSIGNED AUTO_INCREMENT column and make that your primary key.