42
The MySQL Utilities Cools tools for you

MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Embed Size (px)

Citation preview

Page 1: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

The MySQL Utilities

Cools tools for you

Page 2: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Dave Stokes - MySQL Community [email protected]

@Stoker

slideshare.net/davidmstokes

Elephantanddolphin.blogger.com or opensourcedba.wordpress.com

2

Page 3: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Quick MySQL Catch Up21 Years OldMySQL has been part of Oracle’s family of databases for six years.

MySQL 8MySQl 5.7 is the current release but the next version will be MySQL 8. Big feature is real time data dictionary

Group ReplicationActive master-master replication.

JSONA new native JSON datatype to store documents in a column of a table

Document StoreProgrammers not know SQL but need a database? X Devapi allows them to use RDMS from language of choice

EncryptionUse Oracle Key Vault to encrypt your data at rest.

3

Page 4: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

It is a package of utilities that are used for maintenance and administration of MySQL servers. These utilities encapsulate a set of primitive commands, and bundles them so they can be used to perform macro operations with a single command.

The utilities are written in Python, available under the GPLv2 license, and are extendable using the supplied library. They are designed to work with Python versions 2.6 or later and there is no support (yet) for Python v3.1.

The MySQL Utilities?

FREE! FREE!

4

Page 5: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

The MySQL Utilities are

scriptsDesigned to be easily

extensible, use common interfaces, and designed to make complex operations

simple

In other words they automate some fairly gruesome tasks to save you time and sanity

5

Page 6: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

https://dev.mysql.com/downloads/utilities/It is a separate download from MySQL Server

Included with MySQL Workbench

Where to get the MySQL Utilities?

6

Page 7: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Why Use Them?

7

Page 8: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Compare and Contrast -- Copy a database

8

1. On server 1

a. mysqldump -u root World City > foo.sql

b. Scp foo.sql server2

2. On server 2

a. Mysql -u root World < foo.sql

1. On server1 OR server2 or ??

a. Mysqldbcopy --source=root@server1 \

-destination=root@server2 \

world:world

Page 10: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

10

mysqlauditadmin — Allows users to perform maintenance actions on the audit logmysqlauditgrep — Allows users to search the current or an archived audit logmysqlbinlogmove — Binary log relocate utilitymysqlbinlogpurge — Binary log purge utilitymysqlbinlogrotate — Binary log rotate utilitymysqldbcompare — Compare Two Databases and Identify Differencesmysqldbcopy — Copy Database Objects Between Serversmysqldbexport — Export Object Definitions or Data from a Databasemysqldbimport — Import Object Definitions or Data into a Databasemysqldiff — Identify Differences Among Database Objectsmysqldiskusage — Show Database Disk Usagemysqlfailover — Automatic replication health monitoring and failovermysqlfrm — File reader for .frm files.mysqlgrants — Display grants by objectmysqlindexcheck — Identify Potentially Redundant Table Indexesmysqlmetagrep — Search Database Object Definitionsmysqlprocgrep — Search Server Process Listsmysqlreplicate — Set Up and Start Replication Between Two Serversmysqlrplms — Set Up and Start Replication from a Slave to Multiple Mastersmysqlrpladmin — Administration utility for MySQL replicationmysqlrplcheck — Check Replication Prerequisitesmysqlrplshow — Show Slaves for Master Servermysqlrplsync — Replication synchronization checkermysqlserverclone — Clone Existing Server to Create New Servermysqlserverinfo — Display Common Diagnostic Information from a Servermysqlslavetrx — Slave transaction skip utilitymysqluc — Command line client for running MySQL Utilitiesmysqluserclone — Clone Existing User to Create New User

Page 11: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Examples

There are 28 MySQL Utilities

and rather than go into detail on all of them, let us peek at some common tasks using the MySQL Utilities to show you how you can

use them11

Page 12: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Example 1Setup automatic failover on

four MySQL instances running on one server

Master server is on port 3331 and there other servers are setup on 3332, 3333, and 3334

12

Page 13: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

shell> mysqlfailover --master=root@localhost:3331 --discover-

slaves-login=root --log=log.txtMySQL Replication Monitor and Failover UtilityFailover Mode = auto Next Interval = Mon Mar 19 15:56:03 2012

Master Information------------------Binary Log File Position Binlog_Do_DB Binlog_Ignore_DBmysql-bin.000001 571

GTID Executed Set2A67DE00-2DA1-11E2-A711-00764F2BE90F:1-7 [...]

Replication Health Status+------------+-------+---------+--------+------------+---------+| host | port | role | state | gtid_mode | health |+------------+-------+---------+--------+------------+---------+| localhost | 3331 | MASTER | UP | ON | OK || localhost | 3332 | SLAVE | UP | ON | OK || localhost | 3333 | SLAVE | UP | ON | OK || localhost | 3334 | SLAVE | UP | ON | OK |+------------+-------+---------+--------+------------+---------+Q-quit R-refresh H-health G-GTID Lists U-UUIDs L-log entries 13

Page 14: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Q-quit R-refresh H-health G-GTID Lists U-UUIDs L-log entries

If we press G -- GTID Report

Master Information------------------Binary Log File Position Binlog_Do_DB Binlog_Ignore_DBmysql-bin.000001 571

GTID Executed Set2A67DE00-2DA1-11E2-A711-00764F2BE90F:1-7 [...]

Master GTID Executed Set+-------------------------------------------+| gtid |+-------------------------------------------+| 2A67DE00-2DA1-11E2-A711-00764F2BE90F:1-7 || 5503D37E-2DB2-11E2-A781-8077D4C14B33:1-3 |+-------------------------------------------+

14

Page 15: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Failover?Failover starting...# Candidate slave localhost:3332 will become the new master.# Preparing candidate for failover.# Creating replication user if it does not exist.# Stopping slaves.# Performing STOP on all slaves.# Switching slaves to new master.# Starting slaves.# Performing START on all slaves.# Checking slaves for errors.# Failover complete.# Discovering slaves for master at localhost:3332

Failover console will restart in 5 seconds.15

Page 16: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Failed over!!MySQL Replication Monitor and Failover UtilityFailover Mode = auto Next Interval = Mon Mar 19 16:05:12 2012

Master Information------------------Binary Log File Position Binlog_Do_DB Binlog_Ignore_DBmysql-bin.000001 1117

GTID Executed Set2A67DE00-2DA1-11E2-A711-00764F2BE90F:1-7 [...]

UUIDs+------------+-------+---------+--------+------------+---------+| host | port | role | state | gtid_mode | health |+------------+-------+---------+--------+------------+---------+| localhost | 3332 | MASTER | UP | ON | OK || localhost | 3333 | SLAVE | UP | ON | OK || localhost | 3334 | SLAVE | UP | ON | OK |+------------+-------+---------+--------+------------+---------+

16

Page 17: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Compare Two Databases and

Identify Differences

This utility compares the objects and data from two databases to find differences. It identifies objects having different definitions in the two databases and presents them in a diff-style format of choice. Differences in the data are shown using a similar diff-style format. Changed or missing rows are shown in a standard format of GRID, CSV, TAB, or VERTICAL.

‘But it works in test!!’

17

Page 18: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqldbcompare --server1=root@localhost emp1:emp2 --run-all-tests

# server1 on localhost: ... connected.# Checking databases emp1 on server1 and emp2 on server2## WARNING: Objects in server2:emp2 but not in server1:emp1:# TRIGGER: trg# PROCEDURE: p1# TABLE: t1# VIEW: v1#

18

Page 19: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqldbcompare --server1=root@localhost emp1:emp2 --run-all-tests continued

# Data differences found among rows:--- emp1.departments+++ emp2.departments@@ -1,4 +1,4 @@ ************************* 1. row ************************* dept_no: d002- dept_name: dunno+ dept_name: Finance 1 rows.

19

Page 20: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqldbcompare --server1=root@localhost emp1:emp2 --run-all-tests continued even more!# Rows in emp1.departments not in emp2.departments

************************* 1. row ************************* dept_no: d008 dept_name: Research1 rows.

# Rows in emp2.departments not in emp1.departments************************* 1. row ************************* dept_no: d100 dept_name: stupid1 rows.

20

Page 21: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqldbcompare --server1=root@localhost emp1:emp2 --run-all-tests continued even more again!!# TABLE dept_manager pass pass -

# - Compare table checksum pass

# Database consistency check failed.## ...done

21

Page 22: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Disk Usageshell> mysqldiskusage --server=root@localhost employees test# Source on localhost: ... connected.# Database totals:+------------+--------------+| db_name | total |+------------+--------------+| employees | 205,979,648 || test | 4,096 |+------------+--------------+

Total database disk usage = 205,983,744 bytes or 196.00 MB#...done. 22

Page 23: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

shell> mysqldiskusage --server=root@localhost --format=csv -a -vv# Source on localhost: ... connected.# Database totals:db_name,db_dir_size,data_size,misc_files,totaltest1,0,0,0,0db3,0,0,0,0db2,0,0,0,0db1,0,0,0,0backup_test,19410,1117,18293,19410employees,242519463,205979648,242519463,448499111mysql,867211,657669,191720,849389t1,9849,1024,8825,9849test,56162,4096,52066,56162util_test_a,19625,2048,17577,19625util_test_b,17347,0,17347,17347util_test_c,19623,2048,17575,19623

23

Page 24: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqlindexcheck — Identify Potentially Redundant Table Indexesshell> mysqlindexcheck --server=root@localhost employees# Source on localhost: ... connected.# The following indexes are duplicates or redundant \ for table employees.dept_emp:#CREATE INDEX emp_no ON employees.dept_emp (emp_no) USING BTREE# may be redundant or duplicate of:ALTER TABLE employees.dept_emp ADD PRIMARY KEY (emp_no, dept_no)# The following indexes are duplicates or redundant \ for table employees.dept_manager:#CREATE INDEX emp_no ON employees.dept_manager (emp_no) USING BTREE# may be redundant or duplicate of:ALTER TABLE employees.dept_manager ADD PRIMARY KEY (emp_no, dept_no)# The following indexes are duplicates or redundant \ for table employees.salaries:# 24

Page 25: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

25

shell> mysqluserclone --source=root@localhost \ --destination=root@localhost \ joe@localhost sam:secret1@localhost sally:secret2@localhost# Source on localhost: ... connected.# Destination on localhost: ... connected.# Cloning 2 users...# Cloning joe@localhost to user sam:secret1@localhost# Cloning joe@localhost to user sally:secret2@localhost# ...done.

Note: SYS Schema (MySQL 5.6/7) allows you to find redundant indexes, queries running without indexes, and help your spot queries that may need indexes.

Page 26: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

26

Check Grants -- who has permission to do whatshell> mysqlgrants --server=user:pass@localhost:3310 \ --show=user_grants util_test util_test.t3 util_test.t2 \ util_test.t1 util_test.p1 util_test.f1

# DATABASE `util_test`:# - 'joe'@'user' : ALL PRIVILEGES# - 'joe_wildcard'@'%' : ALL PRIVILEGES# - 'priv_test_user'@'%' : EXECUTE, GRANT OPTION, SELECT, TRIGGER, UPDATE# - 'priv_test_user2'@'%' : EXECUTE, SELECT, UPDATE# - 'priv_test_user3'@'%' : ALTER ROUTINE, DELETE, DROP, EXECUTE, TRIGGER, UPDATE

# TABLE `util_test`.`t1`:# - 'joe'@'user' : ALL PRIVILEGES# - 'joe_wildcard'@'%' : ALL PRIVILEGES# - 'priv_test_user'@'%' : GRANT OPTION, SELECT, TRIGGER, UPDATE# - 'priv_test_user2'@'%' : ALL PRIVILEGES, GRANT OPTION# - 'priv_test_user3'@'%' : DELETE, DROP, TRIGGER, UPDATE

Page 27: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

shell> mysqlgrants --server=user:pass@localhost:3310 \ --show=raw util_test util_test.t3 util_test.t2 \ util_test.t1 util_test.p1 util_test.f1

# DATABASE `util_test`:# - For 'joe'@'user'GRANT ALL PRIVILEGES ON `util_test`.* TO 'joe'@'user'# - For 'joe_wildcard'@'%'GRANT ALL PRIVILEGES ON `util_test`.* TO 'joe_wildcard'@'%'# - For 'priv_test_user'@'%'GRANT EXECUTE, TRIGGER ON `util_test`.* TO 'priv_test_user'@'%' WITH GRANT OPTIONGRANT SELECT, UPDATE ON *.* TO 'priv_test_user'@'%'# - For 'priv_test_user2'@'%'GRANT SELECT, UPDATE, SHUTDOWN, EXECUTE ON *.* TO 'priv_test_user2'@'%'# - For 'priv_test_user3'@'%'GRANT DROP, EXECUTE, TRIGGER ON *.* TO 'priv_test_user3'@'%'GRANT UPDATE, DELETE, ALTER ROUTINE ON `util_test`.* TO 'priv_test_user3'@'%'

27

Page 28: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Find all objects with a name that matches the pattern 't_' (the letter t followed by any single character)

28

shell> mysqlmetagrep --pattern="t_" --server=john@localhost+------------------------+--------------+--------------+-----------+| Connection | Object Type | Object Name | Database |+------------------------+--------------+--------------+-----------+| john:*@localhost:3306 | TABLE | t1 | test || john:*@localhost:3306 | TABLE | t2 | test || john:*@localhost:3306 | TABLE | tm | test |+------------------------+--------------+--------------+-----------+

Page 29: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

shell> mysqlmetagrep -b --pattern="%t2%" --server=john@localhost:3306+------------------------+--------------+--------------+-----------+| Connection | Object Type | Object Name | Database |+------------------------+--------------+--------------+-----------+| john:*@localhost:3306 | TRIGGER | tr_foo | test || john:*@localhost:3306 | TABLE | t2 | test |+------------------------+--------------+--------------+-----------+

29

QUESTION: Why is tr_foo listed here when the Object Name does not match “%t2%”?????

Answer: the TRIGGER tr_foo’s body references the object ‘t2’

Page 30: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Process controlshell> mysqlprocgrep --server=root@localhost \ --match-command=sleep --age=1h --kill-connection

You can remove MySQL queries that have been sleeping for one hour

30

Page 31: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

mysqluc

31

...is part of MySQL Workbench (found under tools) and it gives you access to the MySQL Utilities

And you can skip the first 5 letters of each command

Mysqldbcopy = dbcopy

Page 32: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Find processmysqluc> procgrep --sql --match-user=root --match-state=starting --printSELECT Id, User, Host, Db, Command, Time, State, InfoFROM INFORMATION_SCHEMA.PROCESSLISTWHERE USER LIKE 'root' AND STATE LIKE 'starting'

32

Page 33: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

shell> mysqlprocgrep --kill-connection --sql-body \ --match-user=www-data --match-state=sleep

DECLARE kill_done INT;DECLARE kill_cursor CURSOR FOR SELECT Id, User, Host, Db, Command, Time, State, Info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE user LIKE 'www-data' AND State LIKE 'sleep'OPEN kill_cursor;BEGIN DECLARE id BIGINT; DECLARE EXIT HANDLER FOR NOT FOUND SET kill_done = 1; kill_loop: LOOP FETCH kill_cursor INTO id; KILL CONNECTION id; END LOOP kill_loop;END;CLOSE kill_cursor;

33

Page 34: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Replication made easy - Are the settings goodshell> mysqlrplcheck --master=root@host1:3310 --slave=root@host2:3311# master on host1: ... connected.# slave on host2: ... connected.Test Description Status------------------------------------------------------------------------Checking for binary logging on master [pass]Are there binlog exceptions? [pass]Replication user exists? [pass]Checking server_id values [pass]Is slave connected to master? [pass]Check master information file [pass]Checking InnoDB compatibility [pass]Checking storage engines compatibility [pass]Checking lower_case_table_names settings [pass]Checking slave delay (seconds behind master) [pass]

34

Page 35: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

See the topologyshell> mysqlrplshow --master=root@localhost:3311 --recurse --discover-slaves-ln=rootogi# master on localhost: ... connected.# Finding slaves for master: localhost:3311

# Replication Topology Graphlocalhost:3311 (MASTER) | +--- localhost:3310 - (SLAVE) | +--- localhost:3312 - (SLAVE + MASTER) | +--- localhost:3313 - (SLAVE)

35

Page 36: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Cloneshell> mkdir /source/test123

shell> mysqlserverclone --server=root:pass@localhost \ --new-data=/Users/cbell/source/test123 --new-port=3310 \ --root-password=pass --mysqld=--log-bin=mysql-bin# Cloning the MySQL server running on localhost.# Creating new data directory...# Configuring new instance...# Locating mysql tools...# Setting up empty database and mysql tables...# Starting new instance of the server...# Testing connection to new instance...# Success!# Setting the root password...# ...done.

36

Page 37: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

37

shell> mysqlrplms --slave=root:root@localhost:3306 \ --masters=root:root@localhost:3307,root:root@localhost:3308# Starting multi-source replication...# Press CTRL+C to quit.# Switching to master 'localhost:3307'.# master on localhost: ... connected.# slave on localhost: ... connected.## Current Master Information:+-------------------+-----------+---------------+-------------------+| Binary Log File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+-----------+---------------+-------------------+| clone-bin.000001 | 594 | N/A | N/A |+-------------------+-----------+---------------+-------------------+# GTID Executed Set: 00a4e027-a83a-11e3-8bd6-28d244017f26:1-2## Health Status:+------------+-------+---------+--------+------------+---------+| host | port | role | state | gtid_mode | health |+------------+-------+---------+--------+------------+---------+| localhost | 3307 | MASTER | UP | ON | OK || localhost | 3306 | SLAVE | UP | ON | OK || localhost | 3308 | MASTER | UP | ON | OK |+------------+-------+---------+--------+------------+---------+

Page 38: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

38

shell> mysqlrpladmin --master=root@localhost:3331 \

--slaves=root@localhost:3332,root@localhost:3333,root@localhost:3334 \

--candidates=root@localhost:3333,root@localhost:3334 elect# Electing candidate slave from candidate list then slaves list.

# Best slave found is located on localhost:3332.

# ...done.

List Candidate Slaves

Page 39: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Skips a GTID Transactionshell> mysqlslavetrx --gtid-set=af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9 \ --slaves=user:pass@localhost:3311,user:pass@localhost:3312WARNING: Using a password on the command line interface can be insecure.## GTID set to be skipped for each server:# - localhost@3311: af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9# - localhost@3312: af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9## Injecting empty transactions for 'localhost:3311'...# Injecting empty transactions for 'localhost:3312'...##...done. 39

Page 40: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Extending

Easy to extend with a very nice example in the docs. All utils use a three tier organization and support on the Utilities section of Forums.MySQL.Com http://forums.mysql.com/list.php?144

How to at:

https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysql-utils-intro-developers.html

40

Page 41: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Other Recommended Tools

MySQL Workbenchhttps://dev.mysql.com/downloads/workbench/

Percona Toolkithttps://www.percona.com/software/database-tools/percona-

toolkit

41

Page 42: MySQL Utilities -- Cool Tools For You: PHP World Nov 16 2016

Dave Stokes - MySQL Community [email protected]

@Stoker

slideshare.net/davidmstokes

Elephantanddolphin.blogger.com or opensourcedba.wordpress.com

42