1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu MySQL Administrator''''s Bible- P10 doc

50 267 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 1,16 MB

Nội dung

Storage Engines 11 Once this is done you can SELECT from the FEDERATED table and see the rows in the remote table. Limitations of FEDERATED tables Although FEDERATED tables can be extremely useful they do have some limitations. FED- ERATED tables are non-transactional in nature regardless of the support that the remote table might have for transactions. In addition, indexes are not always handled the same for the FEDERATED table as they are for the remote table. FEDERATED tables do not support index prefixes on CHAR, VARCHAR, TEXT,orBLOB columns. There are instances where indexes are not used as expected. Though it is a fairly minor issue, FEDERATED tables do not support the use of ALTER TABLE. To change the table definition of a FEDERATED table you must drop the table and re-create it. Even with these limitations the FEDERATED engine can be very useful when remote data access is needed. NDB storage engine The NDB storage engine is used to build a MySQL Cluster. MySQL Cluster is a shared-nothing, highly available system. MySQL Cluster is designed to avoid a single point of failure. A cluster will contain one or more SQL nodes (traditional MySQL Servers), one or more data nodes, and one or more management servers. For more information about MySQL Cluster, see Chapter 22. Feature summary: ■ Built to provide high availability with redundant sets of data for node failure scenarios. ■ Transactional support. ■ No foreign key support. ■ Row-level locking. ■ Operates either entirely in memory or supports on-disk storage of data columns. Indexes must always be stored in memory. Beginning with MySQL Server version 5.1.24 the standard binaries built by Sun Microsystems will not include the NDB storage engine. Though it is still available with the source code (for now), the code for the NDB storage engine will not be updated to keep pace with changes in the NDB storage engine. If you need to use the NDB storage engine, use the MySQL Cluster server instead of MySQL Server. Archive storage engine The Archive storage engine is a good option for those needing to store data long term or perform data auditing on application operations. For quite some time MySQL has offered an option of using compressed MyISAM tables. There are performance benefits to using compressed 417 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Part III Core MySQL Administration MyISAM tables for read operations, but there are several problems with MyISAM compressed tables: ■ Compressing (or packing) a MyISAM table requires that the database be taken offline while the table is compressed. This is done through the use of the of the myisampack utility from the shell prompt. ■ Compressed MyISAM tables are read-only. You cannot INSERT, DELETE,orUPDATE on a compressed table. Archive tables are, in several ways, an improvement over these older MyISAM packed tables. The designers of the Archive storage engine were definitely looking at what was good about compressed MyISAM tables and improving on the areas of weaknesses of compressed MyISAM tables. Feature summary: ■ Non-transactional. ■ Archive tables allow INSERT operations on the table. However, Archive tables do not allow UPDATE or DELETE operations. For data auditing purposes this is ideal because auditing requirements specify that once data has been created it cannot be changed in any manner. ■ Very good data compression factor. The compression factor on an Archive table is higher than a packed MyISAM table. ■ For reading data, much like the InnoDB engine, the Archive engine uses a snapshot read. This ensures that read operations do not block write operations. ■ The Archive engine uses row-level locking. ■ The Archive storage engine supports only one index. However, in tests, the Archive stor- age engine performs better with read queries than MyISAM packed tables, even when the packed tables have indexes the Archive tables do not. Archive tables use up to four files during operation. All files begin with a filename of the table name. The table definition file has a suffix of .frm. The data file has a suffix of .ARZ. The file with metadata information for the table (if present) has a suffix of .ARM. During table optimiza- tion operations it is also possible that there is a file with a suffix of .ARN. These files will all be located in the directory of the database in which the tables are located. The following shows a modified version of the rental table from the sakila database. Changes were made because Archive tables do not support foreign keys and the rental table had more than one index: mysql> CREATE TABLE `rental_archive` ( -> `rental_id` int(11) NOT NULL AUTO_INCREMENT, -> `rental_date` datetime NOT NULL, -> `inventory_id` mediumint(8) unsigned NOT NULL, -> `customer_id` smallint(5) unsigned NOT NULL, 418 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Storage Engines 11 -> `return_date` datetime DEFAULT NULL, -> `staff_id` tinyint(3) unsigned NOT NULL, -> `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, -> PRIMARY KEY (`rental_id`) -> ) ENGINE=Archive DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) This creates an archival version of the table. Now to demonstrate the ability to perform INSERT statements but not UPDATE or DELETE statements on an Archive table: mysql> INSERT INTO rental_archive -> (rental_date, inventory_id, customer_id, -> return_date, staff_id) values (NOW(),’1’,’23’,NOW(),’1’); Query OK, 1 row affected (0.00 sec) mysql> SELECT rental_id, rental_date, inventory_id, customer_id -> return_date, staff_id, last_update -> FROM rental_archive\G *************************** 1. row *************************** rental_id: 1 rental_date: 2009-01-16 16:44:41 inventory_id: 1 customer_id: 23 return_date: 2009-01-16 16:44:41 staff_id: 1 last_update: 2009-01-16 16:44:41 1 row in set (0.00 sec) mysql> UPDATE rental SET rental_date=NOW() WHERE rental_id=’1’; ERROR 1031 (HY000): Table storage engine for ’rental_archive’ doesn’t have this option mysql> DELETE FROM rental_archive WHERE rental_id=’1’; ERROR 1031 (HY000): Table storage engine for ’rental_archive’ doesn’t have this option In a nutshell, what is demonstrated here, along with the data compression capabilities, are the two primary reasons for using Archive tables. Blackhole storage engine The Blackhole storage engine does not actually store data in tables as with other storage engines. This might seem to be very counter-intuitive. It is a storage engine that does not store data. But there are uses for this setup. A master server may have an extremely high-write table whose data is only ever used on a slave. For example, session information including where a user clicked may be used in reporting queries, but are never queried on the master server. In this case, the table on the master can be created with ENGINE=BLACKHOLE and the table on the slave can be modified to use any storage 419 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Part III Core MySQL Administration engine. In this way, data updates on the master happen instantaneously, because INSERT, UPDATE,andDELETE statements return immediately as successful (so long as they are valid DML statements according to the table schema). This is a frequently used method of having a high-write table cause almost no extra I/O on the master (the binary logs are still written to). Something quite common with large setups is the use of multiple slaves from a master server. If you have too many slaves this can cause load issues on the master server. You can implement a relay slave that acts as an intermediary to reduce this load. We discuss this in detail in Chapter 16. This relay slave can be configured using the Blackhole storage engine for all tables being replicated. Even though the Blackhole tables do not store any data changes, the binary logs are still written if logging is enabled. The relay slave operates much more efficiently because of the minimization of I/O activity. CSV storage engine The CSV (Comma Separated Value) storage engine is an engine of a decidedly different nature. A CSV data file is simply a text file that can be manipulated with a simple text editor or command-line text tools if needed. One of the primary uses for CSV is for data exchange and fast importing. Feature summary: ■ Plain text data file in CSV format ■ Can have an instantaneous import time ■ Easily imported into programs such as Microsoft Excel ■ Table-level locking ■ No foreign key support ■ Non-transactional ■ Trivial backups and restores (copy the files) ■ Does not support indexing or partitions Three files are created with any CSV table: an .frm file, which contains the table format; a .CSM file, which contains metadata; and the .CSV file, which contains the data. Each of these files has a prefix that consists of the table name. Here is a brief example from a snippet of a data file of a three-field CSV table: "1","Overstreet","Joe" "2","Beal", "Sally" "3","Murphy","Ashton" "4","McGhee", "Sam" 420 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Storage Engines 11 Want an instantaneous import time? Just have the data that you want to be imported stored in the CSV format in an export file. Create a new CSV table with the desired fields and then just copy the export file to the directory of the database. Then move the file to table_name.CSV. Issue a FLUSH TABLES command and the data is instantly available. Working with Storage Engines A number of commands are used specifically to work with any storage engine. These commands are extremely useful in the day-to-day work of a system administrator. CREATE TABLE The CREATE TABLE statement is used to create a database table. You can specify the storage engine that you want to use for the table by using the ENGINE clause or the server will use the default storage engine. For example, to create an InnoDB table: CREATE TABLE innodb_example ( id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL ) ENGINE = InnoDB; ALTER TABLE The ALTER TABLE command is used to modify previously created tables. The full syntax for the command is covered in Chapter 4. If you need to change a table type from one storage engine to another the ALTER TABLE command makes this simple. If you executed the previous CREATE TABLE without specifying an ENGINE clause it would create a MyISAM table by default: CREATE TABLE innodb_example ( id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL ); After you create the table you realize it needed to be an InnoDB table. To change this you sim- ply run the ALTER TABLE command: mysql> ALTER TABLE innodb_example ENGINE=InnoDB; That is all there is to it! 421 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Part III Core MySQL Administration DROP TABLE The DROP TABLE command is used to drop a table and all its contents. Be careful, because this action cannot be undone. If it is executed inside a transaction the DROP TABLE command will implicitly commit the transaction before performing the actual DROP TABLE command. mysql> DROP TABLE innodb_example; Summary The amazing variety of storage engines available for MySQL Server can be a great benefit to the database administrator. It allows you to choose the storage engine that best fits the needs of your application. You even have the choice of having more than one storage engine at the same time in your database, and having a table on a slave server have a different storage engine than the same table on the master server. This range of options brings complexity. There are typically many options to configure each storage engine. A beginning administrator should concentrate on understanding the MyISAM and InnoDB storage engines because these are going to be the ones you work with most often in a typical MySQL Server environment. Some of the topics that were taught in this chapter include: ■ Pluggable storage engine architecture ■ Storage engine plugins ■ Available storage engines: ■ MyISAM / Merge ■ InnoDB ■ MEMORY ■ Maria ■ Falcon ■ PBXT ■ FEDERATED ■ NDB ■ Archive ■ Blackhole ■ CSV ■ Commands used to work with storage engines 422 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Caching with MySQL IN THIS CHAPTER Implementing Cache Tables Working with the Query Cache Utilizing Memcached O ne of the ways of making queries respond faster is to implement caching. A cache stores frequently used information in a place where it can be accessed faster. For example, a web browser like Firefox uses a cache to store the text, images, and other objects from recently visited websites on your hard drive. When you visit a page you have recently been to, the text and images do not have to be downloaded a second time. Another way objects on web pages are cached is through a caching proxy server such as Squid ( www.squid-cache.org). A caching proxy server is a proxy between the Internet and a set of machines. It eliminates the redundancy of each machine having a private cache. Furthermore, a cache of web objects from sites that all the machines have recently visited are stored, so a machine can benefit from a proxy cache even if it has never visited a particular web page before. Figure 12-1 shows a simplified diagram of a network of desktops that utilize a caching proxy server for web pages. When users visit a web page their computer will first check the web page cache in their browser as described previously. If the page is not stored locally, the next step is to check the Squid cache. If the web page is not stored in the Squid cache, the web page is downloaded from the actual website — storing objects in the Squid and local browser cache along the way. This may sound complicated, but there is very little overhead from check- ing these caches. When a cache can be used it is much faster than downloading content over the Internet. If you have a hundred people behind a caching proxy, there are going to be many cached web objects that can be accessed by someone else. Everyone behind the web caching proxy benefits from the entire cache. Not only is the user experience faster, but because 423 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Part III Core MySQL Administration there is less need to go to the Internet to download a web page, less bandwidth is used. The drawback is sometimes a web page has been updated and a cache has older information. FIGURE 12-1 Internet Caching Proxy Server Like caching in any other application, caching with MySQL is designed to return data from a query quickly. There are three common ways to cache data with MySQL: creating manual cache tables, using internal caching in mysqld, and using the memcached distributed caching system. Implementing Cache Tables Developers and database administrators spend lots of time optimizing queries. However, one aspect of query optimization that is often overlooked is that a simple data access is much faster than a query with calculations, sorting, and aggregations. A cache table is a regular table in a database that stores the results of one or more queries for faster retrieval. Common query results that could be cached in a table are counts, ratings, and summaries. For example, instead of calculating the number of total site visitors every time someone visits a particular web page, you can set an event in the Event Scheduler to calculate the total number of visitors every 30 minutes and store that information in a visitor count table. Then the slower query to calculate count is run once every 30 minutes, and every single time the web page is visited it does a simple query of the visitor count table. For more information on the Event Scheduler and how to create events, see Chapter 7. As an example, assume it takes 4 seconds to calculate the total visitor count and a quarter of a second to return the results from the visitor count cache table. If there are 100 visitors to a site in 30 minutes, it would take 4 seconds per visitor * 100 visitors = 400 seconds of query processing time to run the query for every visitor. However, if you ran the query once every 30 minutes, it would take 4 seconds for the query to run once + 1/4 second to retrieve data from the cache table * 100 visitors to the site = 29 seconds of query processing time. The benefit is obvious. 424 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Caching with MySQL 12 The tradeoff is that the total count may not be 100% accurate. However, it is likely good enough — visitor count is usually used to show how many people have visited the site, and the count still adds value even if it is off by a few percentage points. The decision of whether or not the number is good enough has to be made through a joint effort between the database administrator and the business to determine if this is a reasonable tradeoff. There is one other tradeoff of using the Event Scheduler — the query is run every 30 minutes, regardless of whether or not the information is used. For example, if nobody visits the website for an hour, there is no reason to recalculate the visitor count. If this is an issue you need to overcome, you will have to coordinate with application developers as well to create querying code that uses the following logic: ■ Check the age of the data in the cache table ■ If the data age is 30 minutes or less, use the data in the cache table ■ If the data age is greater than 30 minutes, re-run the query, storing the results and new time in the cache table It is preferable to schedule an event in the Event Scheduler, but for resource-heavy queries that are run on data that does not change very often, it may be necessary to create custom applica- tion code instead. Going back to our example using the Event Scheduler — after the decision to store total visitor count every 30 minutes is made, there is a problem. The business has changed its requirements, and tells you that the count needs to be 100% accurate; it is unacceptable to have the query take 4 seconds, and there is no money in the budget for faster hardware. This issue can be solved by storing the total visitor count for a time period in the past and then adding the count of visitors since the last calculation. For example, at midnight daily, calculate the total visitor count for the previous day. This count will never change once the day is over, so the count for an entire day never needs to be recalculated. The running total of visitors can be calculated as well, and then a 100% accurate count can be done at any time by calculating the total visitor count so far today and adding it to the running total calculated once per day. Computing the count for one day is much less resource-intensive than running full count every time someone visits a page. Not only will this allow for accurate counts of total visitors, but it will allow for easy computa- tion of number of visitors in a given data range — in our example, the number of visitors in a week can be calculated by adding the seven daily totals of visitors. The previous method did not easily allow for this type of data manipulation. Here is an example of how to create such a system: CREATE TABLE visitors_today ( today INT UNSIGNED NOT NULL DEFAULT 0, vcount BIGINT UNSIGNED NOT NULL DEFAULT 0 ) ENGINE=InnoDB; 425 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Part III Core MySQL Administration CREATE TABLE visitors_stored ( vcount BIGINT UNSIGNED NOT NULL DEFAULT 0, vcount_date DATE NOT NULL PRIMARY KEY ) ENGINE=MyISAM; The visitors_stored table holds a historic record of the count of visitors per day. There can only be one entry per day. The visitors_today table holds the current count of visitors so far today (in the today field) and the total count of visitors up to today (in the vcount field). With each new visitor, update the visitors_today.count field: UPDATE visitors_today SET today = today + 1; To retrieve the current total visitor count: SELECT today + vcount FROM visitors_today; Every day at midnight, schedule an event that: ■ Inserts a new row with yesterday’s date and count in the visitors_stored table ■ Calculates and stores the total running count in visitors_today.vcount ■ Resets the vistors_today.today field to zero Here is a sample event that updates the current and historic visitor count tables: CREATE EVENT update_vcount ON SCHEDULE EVERY 1 DAY STARTS ’2009-01-01 00:00:00’ DO BEGIN INSERT INTO visitors_stored (vcount, vcount_date) SELECT today, CURRENT_DATE() - INTERVAL 1 DAY FROM visitors_today; UPDATE visitors_today set today=0, vcount=( SELECT SUM(vcount) as vcount FROM visitors_stored); END Do not forget to enable the Event Scheduler with SET GLOBAL event_scheduler=’ON’,and recall from Chapter 7 that you will need to change the DELIMITER to define an event with multiple statement events. Also, for the system to function it must be initialized; at minimum you must populate the visitors_today table. If today already had 37 visitors and the total number of visitors at the start of the day was 1,638,492, the following would populate the table properly: INSERT INTO visitors_today (today, vcount) VALUES (37,1638492); For a new system, simply use INSERT INTO visitors_today (today, vcount) VALUES (0,0); . 426 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... Core MySQL Administration the backup files to the appropriate location on your host server and starting mysqld If the snapshot was created while mysqld was shut down, the restore will produce a normal startup If the snapshot was created while mysqld was running, mysqld may think it is recovering from a crash and perform the recovery process The basic procedure for performing a backup of a running MySQL. .. ZFS) ALL ALMOST HOT FAST FAST LEAST FLEXIBLE mysqlhotcopy MyISAM MOSTLY COLD FAST FAST FLEXIBLE mysqldump The mysqldump program has been a backup tool for mysqld for a long time It provides a logical backup of entire database servers, individual databases, individual tables, or even subsets of data using the where option The logical backup created using mysqldump is often called a data dump The output... normally if($result == null) { $query = mysql_ query($sql) or die (mysql_ error()." : $sql"); if (mysql_ num_rows($query)> 0) { $result = mysql_ fetch_object($query); //store the result in memcache $memcache->set($key,$result,0,1800); $content = $result->content; } } ?> Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark 437 12 Part III Core MySQL Administration The code first checks... the code for a database query that does not use memcached: Here is one way to integrate memcached: . NDB storage engine is used to build a MySQL Cluster. MySQL Cluster is a shared-nothing, highly available system. MySQL Cluster is designed to avoid a single. ftp://ftp.tummy.com/pub/ python-memcached/ MySQL UDFs Memcached Functions for MySQL http://tangent.org/586/Memcached_ Functions_for _MySQL. html Though we do not have

Ngày đăng: 26/01/2014, 11:20

TỪ KHÓA LIÊN QUAN

w