RDS Patrick Custom2
Jump to navigation
Jump to search
Thursday Follow-Ups⌘
USING (column)
clause
- (column) is a list of column names required for a join
- must be present in both tables
- introduced to bring
NATURAL
joins in line with standards & SQL Server
SELECT * FROM table1 LEFT JOIN table2 USING (id);
Views & Index⌘
Can Views have indexs?
- nope
Also
- FROM clause of views cannot use subqueries
- if you drop or alter a table that's used by a view, no warning is given
- an error will result when the view is used
- You can use
CHECK TABLE
to see if a view has been invalidated by table changes
- If a user is granted the basic privileges necessary to create a view (the
CREATE VIEW
andSELECT
privileges), that user will be unable to callSHOW CREATE VIEW
on that object unless the user is also granted theSHOW VIEW
privilege
Stored Procedures⌘
Table alters in stored procedures Below is an example given that cites a case on why alters in stored routines are no longer allowed (they used to be).
CREATE VIEW v AS SELECT 1; delimiter // CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0; WHILE i < 5 DO SELECT * FROM v; SET i = i + 1; ALTER VIEW v AS SELECT 2; END WHILE; END; // delimiter ; CALL p();
Because the definition of a view is "locked in" the first time a routine uses a view, p()
returns 1 from each iteration of SELECT
within the loop.
ALTER PROCEDURE⌘
ALTER PROCEDURE proc_name [characteristic ...]
characteristic: COMMENT 'string' | LANGUAGE SQL | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER }
- we can't change the parameters/body of a stored procedure, but you can update the "characteristics" (i.e. metadata) of the SP
MySQL's philosphy on SP's is that they are not transient. It may seem overly prescriptive, the common sentiment is "why would you need to?"
Stored Procedures on RDS⌘
- we can't create triggers or stored procedures out of the box in RDS because we won't get super access to the database server
- if you try, you get something like:
ERROR 1419 (HY000) at line 49: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
Datatypes Requiring Conversions⌘
SQL Server | MySQL |
IDENTITY | AUTO_INCREMENT |
NTEXT, NATIONAL TEXT | TEXT CHARACTER SET UTF& |
SMALLDATETIME | DATETIME |
MONEY | DECIMAL(19,4) |
SMALL MONEY | DECIMAL(10,4) |
UNIQUEIDENTIFIER | BInARY(16) |
SYSNAME | CHAR(256) |
Common Table Expressions⌘
- no direct/linear equivalent in MySQL
- derived tables can be self-referencial in a query
- temporary tables are a reasonable alternative
- exists for the session, dropped when sesion closes
- table names can't trudge on other session temp table names
- requires
CREATE TEMPORARY TABLE
privilege
CREATE TEMPORARY TABLE db.custrollup SELECT p.customerNumber, c.customerName, FORMAT(SUM(p.amount),2) total FROM payments p INNER JOIN customers c ON c.customerNumber = p.customerNumber GROUP BY p.customerNumber ORDER BY total DESC LIMIT 10
Common Table Expressions (con't)⌘
Using derived tables:
SELECT p.customerNumber, p.customerName, c.amount AS total FROM payments AS p INNER JOIN (SELECT customerNumber, FORMAT SUM(amount),2) AS amount FROM db.payments GROUP BY customerNumber) AS c ON c.customerNumber = p.customerNumber GROUP BY p.customerNumber ORDER BY total DESC LIMIT 10
IMPORTS - Tips from AWS⌘
- Create all secondary indexes prior to loading. This is counter-intuitive for those familiar with other databases. Adding or modifying a secondary index causes MySQL to create a new table with the index changes, copy the data from the existing table to the new table, and drop the original table.
- Load data in PK order. This is particularly helpful for InnoDB tables where load times can be reduced by 75-80% and data file size cut in half.
- Disable foreign key constraints foreign_key_checks=0 For flat files loaded with LOAD DATA INFILE, this is required in many cases. For any load, disabling FK checks will provide significant performance gains. Just be sure to enable the constraints and verify the data after the load.
- Load in parallel unless already near a resource limit. Use partitioned tables when appropriate.
- Use multi-value inserts when loading with SQL to minimize statement execution overhead. When using mysqldump, this is done automatically.
- Reduce InnoDB log IO innodb_flush_log_at_trx_commit=0
- Using innodb_flush_log_at_trx_commit=0 causes InnoDB to flush its logs every second instead of at each commit. This provides a significant speed advantage, but can lead to data loss during a crash. Switch it back!
rtree Index⌘
- rtree index is primarily for indexing multi-dimensional data like points and regions
- only in MyISAM storage engine
XML Functionality⌘
[https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html] - highlights
ExtractValue()
extracts a value from an XML string using XPath notation- NOTE: only returns
CDATA
, does not return tags that might be contianed within a matching tag
- NOTE: only returns
UpdateXML()
returns replaced XML fragment- watch for XPath injections!
- No XML data type, and hence no XML columns.
- No support for the SQL/XML or XQuery standards.
- Only a subset of XPath is supported.
- No XQuery Update expressions.
- No XML indexes.
- No support for XML Schemas or document validation.
- No support for namespaces, such as default namespaces or namespace declarations in queries.
- Cannot extract XML fragments or XML attribute values from a document – can only extract atomic XML * element values (text nodes).
- No built-in function for XSLT.
CORRECTION!⌘
- yesterday we talked about
LOW_PRIORITY
and made some jokes aboutHIGH_PRIORITY
statement. - turns out it does exist (though only affects storage engines that use table-level locking)
- usecase:
- table tracking financial transactions
- writes may be
HIGH_PRIORITY
and reporting/read queries may beLOW_PRIORITY
- ensure that the recording of transactions always takes precidence (at the engine-level) over reporting processes
Some Read/Write Notes⌘
- MySQL has some under-the-covers mechanisms for automatic contention management
- MyISAM supports concurrent inserts (enabled by default)
- may be affected by enabling binary logging
- you can explicitly lock InnoDB tables using
LOCK TABLES
, but don't! - can distribute activity using the
MERGE
storage engine- takes a lot more coordination
- RDS makes this mostly unnecessary
- avoid external locking
Federation⌘
What it isn't:
- replication
- a way to give outside people access to your tables (security connection exposure)
- a way to "lighten the load/demand" on a table
Federation (con't)⌘
What it is:
- a MySQL storage engine
- a tunnel to tables on another DB instance
- a good way to distribute query loads within a VPN/VPC
MERGE INTO⌘
- there is no direct/linear equivalent of the
MERGE
statement in MySQL - There are optional conditions that can be added to
INSERT
statement that can be close to the mark, ex:
INSERT INTO db.tablename (id, name) VALUES (1, 'Greg') ON DUPLICATE KEY UPDATE name=VALUES(name);
- using
VALUES()
allows you to specifiy the same value as what's used in theINSERT
statement without repitition - needs
UPDATE
privileges to handle row updates
What is Replication? ⌘
- Data from a master server is replicated to one or more slave servers
- Replication is asynchronous - slaves do not need to be connected permanently to receive updates from the master
- Updates can occur over long-distance connections (i.e. slow/long polling)
- You can replicate all databases, selected databases, or even selected tables within a database
Why replication? ⌘
- Scale-out solutions
- all writes and updates must take place on the master
- reads take place on one or more slaves
- the master is dedicated to updates, slaves are dedicated for reads
- Data security
- to run "backup" services on the slave without corrupting the corresponding master data
- switch to slave if the master is unavailable or corrupted
- Analytics, Data Warehouses
- live data on the master
- analysis of the information takes place on the slave
- Long-distance data distribution and security
- a branch office would like to work with a copy of your main data
- slave can be used without requiring permanent access to the master
Synchronous vs. Asynchronous ⌘
- MySQL support for one-way, asynchronous replication (master -> slave(s))
- The synchronous replication is implemented by MySQL NDB Cluster (master <-> master)
Types of Replication
- Statement Based Replication (SBR)
- replicates entire SQL statements
- Row Based Replication (RBR)
- replicates only the changed rows
- Mixed Based Replication (MBR)
- the default mode within MySQL 5.1.12 and later
How Replication Works (part 1)⌘
- Replication uses binary logging mechanism
- The master writes updates and changes as “events” to the binary log
- Slaves are configured to read the binary log from the master and to execute the events in the binary log on the slave's local database
- The master is “dumb” in this scenario (knows nothing about slaves)
- Each slave will receive a copy of the entire contents of the binary log
How Replication Works (part 2)⌘
- It is the responsibility of the slave to decide which statements in the binary log should be executed
- You cannot configure the master to log only certain events
- If you do not specify otherwise, all events in the master binary log are executed on the slave
- If required, you can configure the slave to process only events that apply to particular databases or tables.
- Each slave keeps a record of the binary log file and position within the log file that it has read and processed from the master (relay)
- This means that multiple slaves can be connected to the master and executing different parts of the same binary log
How Replication Works (part 3)⌘
- Because the slaves control this process, individual slaves can be connected and disconnected from the server without affecting the master's operation
- Slaves can be disconnected, reconnect and then “catch up” by continuing from the recorded position.
- The master and each slave must have a unique ID (server-id)
- The slave must know the master host name, log file name and position within that file
- CHANGE MASTER TO statement sets
- the address of the master
- binary log file name
- position in the binary log
- CHANGE MASTER TO statement stores the data in the master.info file
How to Set Up Replication (from new database) ⌘
- Create a separate user that will be used by your slaves to Authenticate with the master to read the binary log for replication (optional)
- Configure the master to support the binary log and configure a unique ID (required)
- Configure a unique ID for each slave (required)
- Configure the slave with the master settings, such as the host name, login credentials and binary log name and positions
- Start replication
1. Creating a User for Replication ⌘
- Each slave must connect to the master using a standard MySQL user name and password
- Any account can be used for this operation, providing it has been granted the REPLICATION SLAVE privilege
- You do not need to create a specific user for replication. you should be aware that the user name and password will be stored in plain text within the master.info file
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
2. Setting Master Configuration⌘
- You must enable binary logging on the master
- Each server within a replication group must be configured with a unique server-id value
- The server ID is used to identify individual servers within the group, and must be between 1 and 231
- Edit my.cnf or my.ini file
- Add the lines below
[mysqld] log-bin=mysql-bin server-id=1
3. Setting Slave Configuration⌘
- You must set the unique server ID
[mysqld] server-id=2
- If you do not specify a server-id value, it defaults to 0.
- If you omit server-id (or set it explicitly to 0), a master refuses connections from all slaves, and a slave refuses to connect to a master.
- Omitting server-id is good only for backup with a binary log.
- You do NOT have to enable binary logging on the slave for replication to be enabled
4a. Obtaining Master Information⌘
- You must determine the master's current point within the master binary log
- Execute FLUSH TABLES WITH READ LOCK; on the master server and leave the session open
- Use the SHOW MASTER STATUS on the master server to get
- Binary Log Position
- Binary Log Filename
- You now have the information you need to enable the slave to start reading from the binary log in the correct place to start replication.
4b. Configure slave with master settings⌘
- On the master, release the read lock:
- UNLOCK TABLES;
- Start up the MySQL slave
- Execute the CHANGE MASTER TO
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='rep', MASTER_PASSWORD='asdf', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
5. Start Replication⌘
- START SLAVE starts both of the slave threads.
- The I/O thread reads queries from the master server and stores them in the relay log.
- The SQL thread reads the relay log and executes the queries
- START SLAVE requires the SUPER privilege
- Slave threads can start and then later stop
- for example they do not manage to connect to the master or read its binary logs
- START SLAVE does not warn you about this
- You must check the slave's error log for error messages generated by the slave threads
- SHOW SLAVE STATUS shows whether replication is working
Patrick's Bad Art⌘
- (
DML/DDL/DCL⌘
- Data Manipulation Language
- most of the DML driven by SQL standards
- some flavour differences, but the menu is mostly the same
- Data Definition Language
- as we saw yesterday, some minor changees in the syntax order
- core concepts remain the same
- truncate remains one of the bigger differences
MySQL has aTRUNCATE TABLE
statement, but it doesn't always follow the standard.Note that in some cases, MySQL's truncate command is really the equivalent of an unrestricted DELETE command (i.e.: potentially slow and trigger-invoking). Its behaviour depends on whichstorage engine the table is managed by.When using InnoDB (transaction safe) tables,TRUNCATE TABLE
is allowed in a transactioninvolving other operations, howeverTRUNCATE TABLE
implies an immediateCOMMIT
operation.
- Data Control Language
GRANT
,REVOKE
, etc. function as expected
Tools⌘
- reporting & monitoring
- admin and healthchecks
- migration
- MySQL Workbench Migration Tool can automate some of the process http://www.mysql.com/products/workbench/migrate/
- [whitepaper]
- :( I haven't used it
- MySQL Workbench Migration Tool can automate some of the process http://www.mysql.com/products/workbench/migrate/