SlideShare a Scribd company logo
<Insert Picture Here>




Python Utilities for Managing
MySQL Databases
Mats Kindahl, Lars Thalmann, Chuck Bell
THE FOLLOWING IS INTENDED TO OUTLINE OUR GENERAL
    PRODUCT DIRECTION. IT IS INTENDED FOR INFORMATION
    PURPOSES ONLY, AND MAY NOT BE INCORPORATED INTO
    ANY CONTRACT. IT IS NOT A COMMITMENT TO DELIVER ANY
    MATERIAL, CODE, OR FUNCTIONALITY, AND SHOULD NOT BE
    RELIED UPON IN MAKING PURCHASING DECISION. THE
    DEVELOPMENT, RELEASE, AND TIMING OF ANY FEATURES OR
    FUNCTIONALITY DESCRIBED FOR ORACLE'S PRODUCTS
    REMAINS AT THE SOLE DISCRETION OF ORACLE.




2
About the Speakers
    • Mats Kindahl, PhD
      • Replication Expert and Lead Developer
      • mats.kindahl@oracle.com
    • Lars Thalmann, PhD
      • Development Director, Replication, and Backup
      • lars.thalmann@oracle.com
    • Chuck Bell, PhD (not present)
      • MySQL Utilities and Replication
      • chuck.bell@oracle.com




3
Topics
    •   Introduction to MySQL Utilities
    •   List of current utilities
    •   Architecture of MySQL Utilities
    •   Examples of usage
    •   Using the MySQL Utilities Python Library




4
What is MySQL Utilities?
    • A collection of Python utilities for managing MySQL
      databases
    • Part of MySQL Workbench 5.2.31
    • Available under the GPLv2 license
    • Written in Python
    • Easily enhanced using a growing code library
    • Goal is to provide a Python library to grow solutions
      for common administrative problems




5
List of Utilities
    •   mysqldbcompare – compare databases
    •   mysqldbcopy – copy databases between servers
    •   mysqldbexport – export metadata and data
    •   mysqldbimport – import metadata and data
    •   mysqldiff – compare object definitions
    •   mysqldiskusage – show disk usage for databases
    •   mysqlindexcheck – check for redundant indexes
    •   mysqlmetagrep – search metadata
    •   mysqlprocgrep – search process information
    •   mysqlreplicate – setup replication
    •   mysqlrplcheck – check replication configuration


6
List of Utilities
    •   mysqlserverclone – start a scratch server
    •   mysqlserverinfo – show server information
    •   mysqluc – console for utilities
    •   mysqluserclone – clone a user account




7
Utilities in MySQL Workbench
    • Launch the MySQL Utilities command window:
          – Click on the Plugins menu item
          – Select “Start Shell for MySQL Utilities”


    OR

    • From the Workbench main window:
          – Click on the drop down arrow icon to the right of the
               main window
          – Scroll through screens to find the MySQL Utilities icon




8
How do I access the utilities?




9
How do I access the utilities?




10
Structure of the MySQL Utilities

                                            mysqlprocgrep
                               Scripts




          Command                        Common
           Module                         Module
     mysql.utilities.command       mysql.utilities.common

                                  MySQL Utilities Library

11
mysqldbcompare – compare databases
     • Find missing objects from either database
     • Find objects that differ in definition
     • Find differences in data among tables
     • Print difference in formats differ, ndiff, or context
     • Print output rows in GRID, TAB, CSV, or VERTICAL
       formats
     • Scenarios
          • checking master and slave for consistency
          • checking production and development databases for
            consistency
          • generating a difference report for expected differences
            among new and old data
          • comparing backups for differences

12
Sample execution
     $   mysqldbcompare --server1=root@localhost --server2=root@backup_host:3310 
     >   inventory:inventory --run-all-tests
     #   server1 on localhost: ... connected.
     #   server2 on localhost: ... connected.
     #   Checking databases inventory on server1 and inventory on server2

     WARNING: Objects in server1:inventory but not in server2:inventory:
             VIEW: finishing_up
             VIEW: cleaning
                                                         Defn    Row     Data
     Type      Object Name                               Diff    Count   Check
     ---------------------------------------------------------------------------
     TABLE     supplier                                  pass    FAIL    FAIL

     Row counts are not the same among inventory.supplier and inventory.supplier.

     Data differences found among rows:
     --- inventory.supplier
     +++ inventory.supplier
     @@ -1,2 +1,2 @@
      code,name
     -2,Never Enough Inc.       <user>:<password>@<host>:<port>:<socket>
     +2,Wesayso Corporation




13
mysqlmetagrep – search objects
     • Search for objects with names matching a pattern
     • Match using SQL patterns or POSIX regular
       expressions
     • Search bodies of routines (procedures, events,
       triggers)
     • Generate SQL for executing the query
           – Can be used in applications
           – Can be stored in events or views




                                                  _”



14
Searching for objects by name
     Searching a database for objects starting with “t”

       mysqlmetagrep ­­pattern="t_" ­­server=mats@localhost


     $ mysqlmetagrep ­­pattern="t_" ­­server=mats@localhost
     +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+
     | Connection             | Object Type  | Object Name  | Database  | Field Type  | Matches  |
     +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+
     | mats:*@localhost:3307  | TABLE        | t1           | test      | COLUMN      | th       |
     | mats:*@localhost:3307  | TABLE        | t1           | test      | TABLE       | t1       |
     | mats:*@localhost:3307  | TABLE        | t2           | test      | TABLE       | t2       |
     | mats:*@localhost:3307  | TABLE        | tt5          | test      | COLUMN      | t2,t1    |
     +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+




15
Searching routine bodies
      Searching a database for objects containing “l_host”

      mysqlmetagrep ­­body ­­pattern="%l_host%"  
         ­­server=mats@localhost


$ mysqlmetagrep ­­body ­­pattern="%l_host%" ­­server root@localhost:3307
+­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+
| Connection             | Object Type  | Object Name    | Database  | Field Type  | Matches        |
+­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+
| root:*@localhost:3307  | PROCEDURE    | switch_master  | test      | ROUTINE     | switch_master  |
+­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+




16
mysqlprocgrep – search processes
     • Search processes on multiple machines
     • Match by PROCESSLIST fields
           – Id, State, User, Host, Database, Command, State, Info
     • Match by age
           – Find long-running queries, or idle connections
     • Get SQL for performing the query or action
           – Put in application
           – Put in events
     • Kill queries or connections
           – Option: ­­kill­query
           – Option: ­­kill­connection




17
Sample usage
       • Find queries by 'www-data' that have been executing
         for more than 20 minutes
           mysqlprocgrep ­­server=mats@example.com
             ­­match­user=www­data
             ­­match­state=executing
             ­­age=20m 

 +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+
 | Connection               | Id  | User  | Host         | Db    | Command  | Time  | State      | Info               |
 +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+
 | mats:*@example.com:3306  | 53  | mats  | example.com  | user  | Query    | 2040  | executing  | select …           |
 +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+




18
Sample usage
     • Find queries by 'www-data' that have been executing
       for more than 20 minutes
         mysqlprocgrep ­­server=mats@example.com

                                                        m!
           ­­match­user=www­data
           ­­match­state=executing
                                                    The
           ­­age=20m ­­kill­query            i ll
                                               K




19
mysqlreplicate – setup replication
     • Permits an administrator to start replication among
       two servers.
     • User have to provide:
            – Login information to the slave
            – Connection information for the master
     • Example: Setup replication between two instances
     mysqlreplicate --rpl-user=rpl_user:xyzzy
        --master=root@localhost:3306 --slave=root@localhost:3307




20
mysqluc – MySQL Utilities Console
     • User defined variables
     • Help features
     • Tab completion (names, parameters, options,
       variables)




21
MySQL Utilities Python Library
     • Major classes for:
        •   Database
        •   Replication
        •   Server
        •   Index
        •   Table
        •   User
     • Also many helpful methods such as
        •   connect_servers()
        •   setup_common_options()
        •   format_tabular_list()
        •   find_running_servers()



22
Library Example
     • Goal: create a utility that makes a copy of a running
       server and copies all of the data and users.
     • Steps
        •   Setup the parameters
        •   Connect to the original server
        •   Find all of the databases
        •   Find all of the users
        •   Make a clone of the original server
        •   Copy all of the databases
        •   Copy all of the users




23
Utility options
     •   Server to read from: ­­server
     •   Databases: ­­databases
     •   Data directory for new server: ­­new­data
     •   Port for new server: ­­new­port
     •   Server ID for new server: ­­new­id




24
Set up options
     from optparse import OptionParser
     parser = OptionParser()
     parser.add_option("­­server",
                       action="store”, dest="server",
                       type="string", default="root@localhost:3306",
                       help="connection information for original server in "
                        "the form: <user>:<password>@<host>:<port>:<socket>")
     parser.add_option("­d", "­­databases",
                       action="store", dest="dbs_to_copy”, type="string",
                       help="comma­separated list of databases "
                         "to include in the copy (omit for all "
                         " databases)”, default=None)
                .
                .
                .




25
Library Example
     • Parse the connection information
      from mysql.utilities.common.options import parse_connection
      try:
        conn = parse_connection(opt.server)
      except:
        parser.error("Server connection values invalid or"
                     " cannot be parsed.")
     • Connect to original server
      from mysql.utilities.common.server import Server

      server_options = {'conn_info’ : conn, 'role’ : "source"}
      srv1 = Server(server_options)
      srv1.connect()




26
Library Example
     • Find all of the databases
     db_list = [ (db[0],None) for db in srv1.get_all_databases() ]



     • Find all of the users
     _QUERY = """
        SELECT user, host FROM mysql.user
         WHERE user != 'root’ AND user != ''
     """
     users = srv1.exec_query(_QUERY)
     user_list = [ user[0] + '@' + user[1] for user in users ]




27
Library Example
     • Make a clone of the original server

      from mysql.utilities.command.serverclone import clone_server

      res = clone_server(conn, opt.new_data, opt.new_port,
                         opt.new_id, "root", None, False, True)




28
Library Example
     • Copy all of the databases
      # Set destination server connection parameters
      from mysql.utilities.command import dbcopy
      dest = {
        "user"        : conn.get("user"),
        "passwd"      : "root",
        "host"        : conn.get("host"),
        "port"        : opt.new_port,
        "unix_socket" : os.path.join(opt.new_data, "mysql.sock"),
        }
      # Set options for copy
      options = {
        "quiet" : True,
        "force" : True,
        }

      dbcopy.copy_db(conn, dest, db_list, options)




29
Library Example
     • Copy all of the users
      from mysql.utilities.command.userclone import clone_user

      options = {
        "overwrite" : True,
        "quiet"     : True,
        "globals"   : True
      }

      for user in user_list:
        res = clone_user(conn, dest_values, user,
                         (user,), options)




30
Enhancing the example
     • Consistent copy?
            – Locking tables
            – Consistent snapshot (InnoDB)
     • Copying all users?
            – Users not related to the database?
            – Users with only global privileges?
     • Automatically start replication
     • Killing connections?




31
Where To Go From Here
     You can download MySQL Workbench from:
       http://www.mysql.com/downloads/workbench/

     You can also download the latest development source code
     tree for the MySQL Workbench Utilities from:
       http://launchpad/net/mysql­utilities




32
MySQL High Availability
       Get it as free ebook: http://oreilly.com/go/ebookrequest
       Valid this week, mention event “MySQL Replication
      Update”
     MySQL Support: www.mysql.com/contact

     PHP under the hood                      Thu 10:40am
     MySQL Technology Update                 Thu 2:30pm
     MySQL Binlog API                        Fri 10:00am

     Visit MySQL at Oracle booth 701!
33
34

More Related Content

What's hot (20)

PPTX
MariaDB Galera Cluster
Abdul Manaf
 
PDF
Mysql User Camp : 20th June - Mysql New Features
Tarique Saleem
 
PDF
Upgrade to MySQL 5.7 and latest news planned for MySQL 8
Ted Wennmark
 
PDF
Galera cluster for high availability
Mydbops
 
PDF
Galera Cluster for MySQL vs MySQL (NDB) Cluster: A High Level Comparison
Severalnines
 
PDF
PayPal Big Data and MySQL Cluster
Mat Keep
 
PDF
MySQL InnoDB Cluster and NDB Cluster
Mario Beck
 
PDF
Sharding and Scale-out using MySQL Fabric
Mats Kindahl
 
PDF
Modern MySQL Monitoring and Dashboards.
Mydbops
 
PDF
Conference slides: MySQL Cluster Performance Tuning
Severalnines
 
PDF
Building Scalable High Availability Systems using MySQL Fabric
Mats Kindahl
 
PPTX
Hello OpenStack, Meet Hadoop
DataWorks Summit
 
PDF
MySQL Fabric: Easy Management of MySQL Servers
Mats Kindahl
 
PPT
OSSCube MySQL Cluster Tutorial By Sonali At Osspac 09
OSSCube
 
PPTX
Multi-tenant, Multi-cluster and Multi-container Apache HBase Deployments
DataWorks Summit
 
PPTX
2015: Whats New in MySQL 5.7, At Oracle Open World, November 3rd, 2015
Geir Høydalsvik
 
PDF
My sql5.7 whatsnew_presentedatgids2015
Sanjay Manwani
 
PDF
Connector/J Beyond JDBC: the X DevAPI for Java and MySQL as a Document Store
Filipe Silva
 
PDF
Hadoop and OpenStack
DataWorks Summit
 
PDF
Ramp-Tutorial for MYSQL Cluster - Scaling with Continuous Availability
Pythian
 
MariaDB Galera Cluster
Abdul Manaf
 
Mysql User Camp : 20th June - Mysql New Features
Tarique Saleem
 
Upgrade to MySQL 5.7 and latest news planned for MySQL 8
Ted Wennmark
 
Galera cluster for high availability
Mydbops
 
Galera Cluster for MySQL vs MySQL (NDB) Cluster: A High Level Comparison
Severalnines
 
PayPal Big Data and MySQL Cluster
Mat Keep
 
MySQL InnoDB Cluster and NDB Cluster
Mario Beck
 
Sharding and Scale-out using MySQL Fabric
Mats Kindahl
 
Modern MySQL Monitoring and Dashboards.
Mydbops
 
Conference slides: MySQL Cluster Performance Tuning
Severalnines
 
Building Scalable High Availability Systems using MySQL Fabric
Mats Kindahl
 
Hello OpenStack, Meet Hadoop
DataWorks Summit
 
MySQL Fabric: Easy Management of MySQL Servers
Mats Kindahl
 
OSSCube MySQL Cluster Tutorial By Sonali At Osspac 09
OSSCube
 
Multi-tenant, Multi-cluster and Multi-container Apache HBase Deployments
DataWorks Summit
 
2015: Whats New in MySQL 5.7, At Oracle Open World, November 3rd, 2015
Geir Høydalsvik
 
My sql5.7 whatsnew_presentedatgids2015
Sanjay Manwani
 
Connector/J Beyond JDBC: the X DevAPI for Java and MySQL as a Document Store
Filipe Silva
 
Hadoop and OpenStack
DataWorks Summit
 
Ramp-Tutorial for MYSQL Cluster - Scaling with Continuous Availability
Pythian
 

Viewers also liked (20)

PDF
Www Kitebird Com Articles Pydbapi Html Toc 1
AkramWaseem
 
ODP
Rethink db with Python
Prabhu Raghav
 
PPTX
Succumbing to the Python in Financial Markets
dcerezo
 
PDF
"PostgreSQL and Python" Lightning Talk @EuroPython2014
Henning Jacobs
 
PDF
MySQL User Conference 2009: Python and MySQL
Ted Leung
 
PDF
Scaling mysql with python (and Docker).
Roberto Polli
 
PDF
Python for Derivative Analytics
Alicia G
 
PPTX
Relational Database Access with Python ‘sans’ ORM
Mark Rees
 
PDF
Programming with Python and PostgreSQL
Peter Eisentraut
 
PDF
PostgreSQLとPythonとSQL
Satoshi Yamada
 
PPTX
Python for Big Data Analytics
Edureka!
 
PPTX
Python for Big Data Analytics
Edureka!
 
PDF
St.John Freight Systems Ltd_Corporate Profile
vigneshd
 
PPTX
Neural Text Embeddings for Information Retrieval (WSDM 2017)
Bhaskar Mitra
 
PDF
Ten Reasons Why You Should Prefer PostgreSQL to MySQL
anandology
 
PDF
Aplicando Design Thinking al diseño de tu vida
UX Nights
 
PDF
L'analytics pour les publishers conférence aadf
Prénom Nom de famille
 
PDF
Fluorochemical Solutions for the Automotive Industry
AGC Chemicals Americas
 
PPTX
The Travelling Pentester: Diaries of the Shortest Path to Compromise
Will Schroeder
 
PDF
La Normandie : son histoire
laurentridel
 
Www Kitebird Com Articles Pydbapi Html Toc 1
AkramWaseem
 
Rethink db with Python
Prabhu Raghav
 
Succumbing to the Python in Financial Markets
dcerezo
 
"PostgreSQL and Python" Lightning Talk @EuroPython2014
Henning Jacobs
 
MySQL User Conference 2009: Python and MySQL
Ted Leung
 
Scaling mysql with python (and Docker).
Roberto Polli
 
Python for Derivative Analytics
Alicia G
 
Relational Database Access with Python ‘sans’ ORM
Mark Rees
 
Programming with Python and PostgreSQL
Peter Eisentraut
 
PostgreSQLとPythonとSQL
Satoshi Yamada
 
Python for Big Data Analytics
Edureka!
 
Python for Big Data Analytics
Edureka!
 
St.John Freight Systems Ltd_Corporate Profile
vigneshd
 
Neural Text Embeddings for Information Retrieval (WSDM 2017)
Bhaskar Mitra
 
Ten Reasons Why You Should Prefer PostgreSQL to MySQL
anandology
 
Aplicando Design Thinking al diseño de tu vida
UX Nights
 
L'analytics pour les publishers conférence aadf
Prénom Nom de famille
 
Fluorochemical Solutions for the Automotive Industry
AGC Chemicals Americas
 
The Travelling Pentester: Diaries of the Shortest Path to Compromise
Will Schroeder
 
La Normandie : son histoire
laurentridel
 
Ad

Similar to Python Utilities for Managing MySQL Databases (20)

PDF
MySQL Baics - Texas Linxufest beginners tutorial May 31st, 2019
Dave Stokes
 
PDF
Access Data from XPages with the Relational Controls
Teamstudio
 
PDF
Monitoring Oracle Database Instances with Zabbix
Gerger
 
PDF
Rails Tips and Best Practices
David Keener
 
PDF
4 docker small_web_micro_services
FEG
 
PDF
MySQL Workbench for DFW Unix Users Group
Dave Stokes
 
PPTX
PythonDatabaseAPI -Presentation for Database
dharawagh9999
 
PPT
Php connectivitywithmysql
Bhumivaghasiya
 
PPTX
Clustrix Database Percona Ruby on Rails benchmark
Clustrix
 
PDF
MySQL Workbench and Visual Explain -- RMUG Feb 19th 2015
Dave Stokes
 
PDF
Perl Programming - 04 Programming Database
Danairat Thanabodithammachari
 
PPT
2. Lecture2_NOSQL_KeyValue.ppt
ShaimaaMohamedGalal
 
PPTX
Efficient working with Databases in LabVIEW - Sam Sharp (MediaMongrels Ltd) -...
MediaMongrels Ltd
 
PPTX
AZMS PRESENTATION.pptx
SonuShaw16
 
PPTX
3-Chapter-Edit.pptx debre tabour university
alemunuruhak9
 
PDF
Lessons learned while building Omroep.nl
bartzon
 
PPTX
SQL To NoSQL - Top 6 Questions Before Making The Move
IBM Cloud Data Services
 
PDF
PuppetDB: A Single Source for Storing Your Puppet Data - PUG NY
Puppet
 
PDF
MySQL Utilities -- PyTexas 2015
Dave Stokes
 
PDF
Lessons learned while building Omroep.nl
tieleman
 
MySQL Baics - Texas Linxufest beginners tutorial May 31st, 2019
Dave Stokes
 
Access Data from XPages with the Relational Controls
Teamstudio
 
Monitoring Oracle Database Instances with Zabbix
Gerger
 
Rails Tips and Best Practices
David Keener
 
4 docker small_web_micro_services
FEG
 
MySQL Workbench for DFW Unix Users Group
Dave Stokes
 
PythonDatabaseAPI -Presentation for Database
dharawagh9999
 
Php connectivitywithmysql
Bhumivaghasiya
 
Clustrix Database Percona Ruby on Rails benchmark
Clustrix
 
MySQL Workbench and Visual Explain -- RMUG Feb 19th 2015
Dave Stokes
 
Perl Programming - 04 Programming Database
Danairat Thanabodithammachari
 
2. Lecture2_NOSQL_KeyValue.ppt
ShaimaaMohamedGalal
 
Efficient working with Databases in LabVIEW - Sam Sharp (MediaMongrels Ltd) -...
MediaMongrels Ltd
 
AZMS PRESENTATION.pptx
SonuShaw16
 
3-Chapter-Edit.pptx debre tabour university
alemunuruhak9
 
Lessons learned while building Omroep.nl
bartzon
 
SQL To NoSQL - Top 6 Questions Before Making The Move
IBM Cloud Data Services
 
PuppetDB: A Single Source for Storing Your Puppet Data - PUG NY
Puppet
 
MySQL Utilities -- PyTexas 2015
Dave Stokes
 
Lessons learned while building Omroep.nl
tieleman
 
Ad

More from Mats Kindahl (8)

PDF
Why rust?
Mats Kindahl
 
PDF
High-Availability using MySQL Fabric
Mats Kindahl
 
PDF
MySQL Applier for Apache Hadoop: Real-Time Event Streaming to HDFS
Mats Kindahl
 
PDF
MySQL Sharding: Tools and Best Practices for Horizontal Scaling
Mats Kindahl
 
PDF
Replication Tips & Trick for SMUG
Mats Kindahl
 
PDF
Sharding using MySQL and PHP
Mats Kindahl
 
PDF
Replication Tips & Tricks
Mats Kindahl
 
PDF
MySQL Binary Log API Presentation - OSCON 2011
Mats Kindahl
 
Why rust?
Mats Kindahl
 
High-Availability using MySQL Fabric
Mats Kindahl
 
MySQL Applier for Apache Hadoop: Real-Time Event Streaming to HDFS
Mats Kindahl
 
MySQL Sharding: Tools and Best Practices for Horizontal Scaling
Mats Kindahl
 
Replication Tips & Trick for SMUG
Mats Kindahl
 
Sharding using MySQL and PHP
Mats Kindahl
 
Replication Tips & Tricks
Mats Kindahl
 
MySQL Binary Log API Presentation - OSCON 2011
Mats Kindahl
 

Recently uploaded (20)

PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 

Python Utilities for Managing MySQL Databases

  • 1. <Insert Picture Here> Python Utilities for Managing MySQL Databases Mats Kindahl, Lars Thalmann, Chuck Bell
  • 2. THE FOLLOWING IS INTENDED TO OUTLINE OUR GENERAL PRODUCT DIRECTION. IT IS INTENDED FOR INFORMATION PURPOSES ONLY, AND MAY NOT BE INCORPORATED INTO ANY CONTRACT. IT IS NOT A COMMITMENT TO DELIVER ANY MATERIAL, CODE, OR FUNCTIONALITY, AND SHOULD NOT BE RELIED UPON IN MAKING PURCHASING DECISION. THE DEVELOPMENT, RELEASE, AND TIMING OF ANY FEATURES OR FUNCTIONALITY DESCRIBED FOR ORACLE'S PRODUCTS REMAINS AT THE SOLE DISCRETION OF ORACLE. 2
  • 3. About the Speakers • Mats Kindahl, PhD • Replication Expert and Lead Developer • [email protected] • Lars Thalmann, PhD • Development Director, Replication, and Backup • [email protected] • Chuck Bell, PhD (not present) • MySQL Utilities and Replication • [email protected] 3
  • 4. Topics • Introduction to MySQL Utilities • List of current utilities • Architecture of MySQL Utilities • Examples of usage • Using the MySQL Utilities Python Library 4
  • 5. What is MySQL Utilities? • A collection of Python utilities for managing MySQL databases • Part of MySQL Workbench 5.2.31 • Available under the GPLv2 license • Written in Python • Easily enhanced using a growing code library • Goal is to provide a Python library to grow solutions for common administrative problems 5
  • 6. List of Utilities • mysqldbcompare – compare databases • mysqldbcopy – copy databases between servers • mysqldbexport – export metadata and data • mysqldbimport – import metadata and data • mysqldiff – compare object definitions • mysqldiskusage – show disk usage for databases • mysqlindexcheck – check for redundant indexes • mysqlmetagrep – search metadata • mysqlprocgrep – search process information • mysqlreplicate – setup replication • mysqlrplcheck – check replication configuration 6
  • 7. List of Utilities • mysqlserverclone – start a scratch server • mysqlserverinfo – show server information • mysqluc – console for utilities • mysqluserclone – clone a user account 7
  • 8. Utilities in MySQL Workbench • Launch the MySQL Utilities command window: – Click on the Plugins menu item – Select “Start Shell for MySQL Utilities” OR • From the Workbench main window: – Click on the drop down arrow icon to the right of the main window – Scroll through screens to find the MySQL Utilities icon 8
  • 9. How do I access the utilities? 9
  • 10. How do I access the utilities? 10
  • 11. Structure of the MySQL Utilities mysqlprocgrep Scripts Command Common Module Module mysql.utilities.command mysql.utilities.common MySQL Utilities Library 11
  • 12. mysqldbcompare – compare databases • Find missing objects from either database • Find objects that differ in definition • Find differences in data among tables • Print difference in formats differ, ndiff, or context • Print output rows in GRID, TAB, CSV, or VERTICAL formats • Scenarios • checking master and slave for consistency • checking production and development databases for consistency • generating a difference report for expected differences among new and old data • comparing backups for differences 12
  • 13. Sample execution $ mysqldbcompare --server1=root@localhost --server2=root@backup_host:3310 > inventory:inventory --run-all-tests # server1 on localhost: ... connected. # server2 on localhost: ... connected. # Checking databases inventory on server1 and inventory on server2 WARNING: Objects in server1:inventory but not in server2:inventory: VIEW: finishing_up VIEW: cleaning Defn Row Data Type Object Name Diff Count Check --------------------------------------------------------------------------- TABLE supplier pass FAIL FAIL Row counts are not the same among inventory.supplier and inventory.supplier. Data differences found among rows: --- inventory.supplier +++ inventory.supplier @@ -1,2 +1,2 @@ code,name -2,Never Enough Inc. <user>:<password>@<host>:<port>:<socket> +2,Wesayso Corporation 13
  • 14. mysqlmetagrep – search objects • Search for objects with names matching a pattern • Match using SQL patterns or POSIX regular expressions • Search bodies of routines (procedures, events, triggers) • Generate SQL for executing the query – Can be used in applications – Can be stored in events or views _” 14
  • 15. Searching for objects by name Searching a database for objects starting with “t”   mysqlmetagrep ­­pattern="t_" ­­server=mats@localhost $ mysqlmetagrep ­­pattern="t_" ­­server=mats@localhost +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ | Connection             | Object Type  | Object Name  | Database  | Field Type  | Matches  | +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ | mats:*@localhost:3307  | TABLE        | t1           | test      | COLUMN      | th       | | mats:*@localhost:3307  | TABLE        | t1           | test      | TABLE       | t1       | | mats:*@localhost:3307  | TABLE        | t2           | test      | TABLE       | t2       | | mats:*@localhost:3307  | TABLE        | tt5          | test      | COLUMN      | t2,t1    | +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­+ 15
  • 16. Searching routine bodies Searching a database for objects containing “l_host” mysqlmetagrep ­­body ­­pattern="%l_host%"   ­­server=mats@localhost $ mysqlmetagrep ­­body ­­pattern="%l_host%" ­­server root@localhost:3307 +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+ | Connection             | Object Type  | Object Name    | Database  | Field Type  | Matches        | +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+ | root:*@localhost:3307  | PROCEDURE    | switch_master  | test      | ROUTINE     | switch_master  | +­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+ 16
  • 17. mysqlprocgrep – search processes • Search processes on multiple machines • Match by PROCESSLIST fields – Id, State, User, Host, Database, Command, State, Info • Match by age – Find long-running queries, or idle connections • Get SQL for performing the query or action – Put in application – Put in events • Kill queries or connections – Option: ­­kill­query – Option: ­­kill­connection 17
  • 18. Sample usage • Find queries by 'www-data' that have been executing for more than 20 minutes     mysqlprocgrep ­­[email protected]     ­­match­user=www­data     ­­match­state=executing     ­­age=20m  +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+ | Connection               | Id  | User  | Host         | Db    | Command  | Time  | State      | Info               | +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+ | mats:*@example.com:3306  | 53  | mats  | example.com  | user  | Query    | 2040  | executing  | select …           | +­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­+­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­+ 18
  • 19. Sample usage • Find queries by 'www-data' that have been executing for more than 20 minutes     mysqlprocgrep ­­[email protected] m!     ­­match­user=www­data     ­­match­state=executing The     ­­age=20m ­­kill­query  i ll K 19
  • 20. mysqlreplicate – setup replication • Permits an administrator to start replication among two servers. • User have to provide: – Login information to the slave – Connection information for the master • Example: Setup replication between two instances mysqlreplicate --rpl-user=rpl_user:xyzzy --master=root@localhost:3306 --slave=root@localhost:3307 20
  • 21. mysqluc – MySQL Utilities Console • User defined variables • Help features • Tab completion (names, parameters, options, variables) 21
  • 22. MySQL Utilities Python Library • Major classes for: • Database • Replication • Server • Index • Table • User • Also many helpful methods such as • connect_servers() • setup_common_options() • format_tabular_list() • find_running_servers() 22
  • 23. Library Example • Goal: create a utility that makes a copy of a running server and copies all of the data and users. • Steps • Setup the parameters • Connect to the original server • Find all of the databases • Find all of the users • Make a clone of the original server • Copy all of the databases • Copy all of the users 23
  • 24. Utility options • Server to read from: ­­server • Databases: ­­databases • Data directory for new server: ­­new­data • Port for new server: ­­new­port • Server ID for new server: ­­new­id 24
  • 25. Set up options from optparse import OptionParser parser = OptionParser() parser.add_option("­­server",                   action="store”, dest="server",                   type="string", default="root@localhost:3306",                   help="connection information for original server in "                    "the form: <user>:<password>@<host>:<port>:<socket>") parser.add_option("­d", "­­databases",                   action="store", dest="dbs_to_copy”, type="string",                   help="comma­separated list of databases "                     "to include in the copy (omit for all "                     " databases)”, default=None)            .            .            . 25
  • 26. Library Example • Parse the connection information from mysql.utilities.common.options import parse_connection try: conn = parse_connection(opt.server) except: parser.error("Server connection values invalid or" " cannot be parsed.") • Connect to original server from mysql.utilities.common.server import Server server_options = {'conn_info’ : conn, 'role’ : "source"} srv1 = Server(server_options) srv1.connect() 26
  • 27. Library Example • Find all of the databases db_list = [ (db[0],None) for db in srv1.get_all_databases() ] • Find all of the users _QUERY = """ SELECT user, host FROM mysql.user WHERE user != 'root’ AND user != '' """ users = srv1.exec_query(_QUERY) user_list = [ user[0] + '@' + user[1] for user in users ] 27
  • 28. Library Example • Make a clone of the original server from mysql.utilities.command.serverclone import clone_server res = clone_server(conn, opt.new_data, opt.new_port, opt.new_id, "root", None, False, True) 28
  • 29. Library Example • Copy all of the databases # Set destination server connection parameters from mysql.utilities.command import dbcopy dest = { "user" : conn.get("user"), "passwd" : "root", "host" : conn.get("host"), "port" : opt.new_port, "unix_socket" : os.path.join(opt.new_data, "mysql.sock"), } # Set options for copy options = { "quiet" : True, "force" : True, } dbcopy.copy_db(conn, dest, db_list, options) 29
  • 30. Library Example • Copy all of the users from mysql.utilities.command.userclone import clone_user options = { "overwrite" : True, "quiet" : True, "globals" : True } for user in user_list: res = clone_user(conn, dest_values, user, (user,), options) 30
  • 31. Enhancing the example • Consistent copy? – Locking tables – Consistent snapshot (InnoDB) • Copying all users? – Users not related to the database? – Users with only global privileges? • Automatically start replication • Killing connections? 31
  • 32. Where To Go From Here You can download MySQL Workbench from: http://www.mysql.com/downloads/workbench/ You can also download the latest development source code tree for the MySQL Workbench Utilities from: http://launchpad/net/mysql­utilities 32
  • 33. MySQL High Availability Get it as free ebook: http://oreilly.com/go/ebookrequest Valid this week, mention event “MySQL Replication Update” MySQL Support: www.mysql.com/contact PHP under the hood Thu 10:40am MySQL Technology Update Thu 2:30pm MySQL Binlog API Fri 10:00am Visit MySQL at Oracle booth 701! 33
  • 34. 34