Help

Sales

Customers


SQLyog 8.13 RC Has Been released

peter_laursen

Changes (as compared to beta 3) include:

Bug Fixes:
* ‘reorder columns’ threw away ” (empty string) DEFAULTs for string columns.
* When data were changed in GRIDs and  the GRID-curser was moved to another row of the GRID by right-clicking in a cell of another row of the GRID, no UPDATE statement was sent (left-click and arrow-down key worked as expected).
* With low wait_timeout setting on <target> it could happen that Data Sync took more time than this setting to prepare a BULK INSERT statement. Connection to <target> would be lost and sync not completed. We now SET wait_timeout = 28800 in Data  Sync. Also ‘restore from SQL dump’ will now do the same.
* Mails sent by SJA could truncate a HTML tag for background color. ‘white’ would become ‘hite’.  The display with specific email clients was unpredictable.

Downloads: http://webyog.com/en/downloads.php
Purchase: http://webyog.com/en/buy.php


MONyog database schema explained.

peter_laursen

Purpose of this article:
In this post we will reveal the necessary SQLite schema details to be used for managing MONyog connections (copying connections/creating new connections etc.) without using the ‘register servers’ page in the MONyog GUI. Also with this information you will get the basic understanding of how data are stored so that you will be able to query the database for information without using MONyog should you sometimes want to do that.

Note that if multiple applications use the same database one may issue LOCKS that cause the other to wait, so generally we suggest that you use a copy of the database.

What is MONyog’s data?
Ever wondered how MONyog manages the data? MONyog uses SQLite for storing all the data. With ‘data’, we are referring to:

1) Data collected from MySQL servers. (stored in the database file mysql.data)
2) Data collected from the operating system (currently availabale for Linux only, stored in the database file system.data).
3) Data captured from ‘sniffing’ (stored in the database file sniffer.data).
4) Also the connection details are stored in SQLite (connection.data).

There is one of each of those database files for every connection.

Where can you find this data?
Here are the default paths where you can find the data collected by MONyog for the first connection created by MONyog.

1: In windows systems:
XP or older: C:\Documents and Settings\All Users\Application Data\Webyog\MONyog\data\0001
Vista and newer: C:\ProgramData\Webyog\MONyog\Data\0001

2: In Linux systems:
RPM: /usr/local/MONyog/data/0001
Tar: In the same directory where MONyog was ‘untarred’.

When using the GUI to register a server a folder for each connection is created automatically. Folders are named with a 4-digit numerical name (’0001′, ’0002′ etc.). Any number up to 9999 is valid. At start-up MONyog will check for such and use them. So if you simply need to duplicate a connection you can simply copy the ’0002′ folder for instance and rename to ’0003′ or whatever (MONyog must be stopped while doing).

How to view existing schema and data?
You can view the existing schema and data by using a SQLite client. In addition to the official SQLite command-line client there are simple GUI clients available like:

https://addons.mozilla.org/en-US/firefox/addon/5817 (this is a plugin for the Firefox browser and will work on all platforms, but there are more GUI clients available for download – mostly for Windows. Most Linux distributions ship with some database client software that handles SQLite).

NOTE: schemas may be subject to change. We may add/remove columns, change data types, change indexes etc. with new releases. When we do that, you can check in release notes and you can open the database with the tools mentioned to see the columns.

Details of the Schema:

a) Preferences and global settings.
In addition to the data stored on a per-server basis Monyog has a database storing global user preferences (preferences.config database) and also a very tiny text file (MONyog.ini), that only has what minimal information is required for MONyog to start.

b) Information about the MONyog database schema itself.
There is a schema_version table in all databases created by MONyog. Every time MONyog starts it will check here if the database is up to date with the current program version. If it is not MONyog will perform the necessary schema upgrades at start-up. Schema definition reads:

CREATE TABLE IF NOT EXISTS [schema_version] (
[schema_desc] TEXT,
[schema_major_version] TEXT,
[schema_minor_version] TEXT,
PRIMARY KEY ([schema_major_version], [schema_minor_version]))

c) mysql.data and system.data:
These two databases have a completely identical structure:

CREATE TABLE IF NOT EXISTS [metric_master] (
[metric_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
[metric_desc] TEXT ASC UNIQUE )

CREATE TABLE IF NOT EXISTS [snapshot_master] (
[timestamp_id] INTEGER NOT NULL,
[metric_id] INTEGER NOT NULL,
[metric_now] TEXT,
[metric_diff] TEXT,
PRIMARY KEY (metric_id, timestamp_id))

CREATE INDEX IF NOT EXISTS [timestamp_id_index] ON [snapshot_master] ([timestamp_id])

CREATE TABLE IF NOT EXISTS [timestamp_master] (
[timestamp_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
[server_timestamp] INTEGER,
[server_start_time] INTEGER,
[server_uptime] INTEGER,
[server_uptime_diff] INTEGER,
[server_is_connected] INTEGER)

CREATE INDEX IF NOT EXISTS [server_timestamp_idx] ON [timestamp_master] ([server_timestamp])

What is most important to understand here is the [timestamp_id] column occurring in both [snapshot_master] and [timestamp_master] tables. Actually with MySQL and InnoDB you would probably create a Foreign Key from [snapshot_master] to [timestamp_master] for constraining and clarity. To get meaningful results you will need to JOIN the two in the query or use a SUBQUERY.

Let us explain basically how they work:
1) Everytime MONyog sends a statement like SHOW VARIABLES/STATUS of some kind (or fetching a OS metric from Linux /proc folder) one row is INSERTED into [timestamp_master] table with information about current time and the metrics retrieved for each such statement will be INSERTED into [snapshot_master]. The [snapshot_master] table contains the metrics details. The [timestamp_id] column identifies when metric details were like that. And also note that timestamps in MONyog databases are unix_timestamps.

2) And actually we do not always INSERT into [snapshot_master]. Only if the particular metric was changed since last time something was INSERTED for that metric we will INSERT again. So if you want to find the value of a metric at some particular time you will need to find the most recent value stored before that particular time for that particular metric.

3) Finally note that [snapshot_master] does not have the names of the metrics. It is not possible to know in advance what metrics the server will return as it depends on server details (version and configuration). And actually a server may be upgraded. And also saving each textual description only once will save disk space. So [snapshot_master] only contains a number in the [metric_id] column referring to the textual description the [metric_master] table. So if the query shall return the name of the metric or the metric name shall be used in a WHERE-clause also [metric_master] table must be referenced in the query. If you are familiar with the SHOW statements and what information they return you will easily identify the meaning of each row in [metric_master] table.

Note that the term ‘metric’ here refers to the discrete values returned for SHOW statements themselves (SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS; SHOW SLAVE STATUS etc.). Whatever calculations MONyog does in its web interface are done after and not before storage. But we do one calculation before storing however: whenever a metric is INSERTED we will also retrieve that latest stored value for the same metric and calculate the difference. Both the current value and this difference is stored (in [metric_now] and [metric_diff] columns respectively).

An example of an easily understandable query doing all this could look like:

monyog1

An example of a query that we actually execute (optimized for large SQLite databases) to populate a graph is

SELECT metric_now
FROM snapshot_master
WHERE snapshot_master.metric_id = my_metric_id
AND snapshot_master.timestamp_id IN(
SELECT MAX(timestamp_id)
FROM snapshot_master
WHERE metric_id = my_metric_id
AND timestamp_id <= (
SELECT MAX(timestamp_id)
FROM timestamp_master
WHERE server_timestamp <= my_metric_timestamp)
)

Actually SQLite support has recommended using SUBQUERIES and not JOINS in most cases with SQLite for best performance with big databases. That is also the experience we have have ourselves when profiling different queries returning same results.

d) sniffer.data
CREATE TABLE IF NOT EXISTS [query_master](
[id] INTEGER PRIMARY KEY AUTOINCREMENT,
[query] TEXT,
[host] TEXT DEFAULT '',
UNIQUE([query]))

CREATE TABLE IF NOT EXISTS [query_snapshot] (
[pkeyid] INTEGER PRIMARY KEY AUTOINCREMENT,
[id] INTEGER,
[threadid] INTEGER,
[user] TEXT,
[querytime] INTEGER,
[uptime] INTEGER)

Here you see the same pattern as above: the [id] column in the [query_snapshot] table identifies a row in the [query_master] where the actual/textual query is saved. Also note that a UNIQUE KEY is defined on the [query] column so that we can use an INSERT .. ON DUPLICATE KEY construction and thus ensure that the [query_master] table only has the same query stored once. But in [query_snapshot] table there will be one row for every instance of the query.

And actually with general/slow log analysis we use identical tables. The log CHUNK as retrieved from the server will be parsed and the tables populated like you see in your sniffer.data database. The tables used for log analysis however are MEMORY tables and will only be available from MONyog and only for as long as they are needed.

e) connection.data:
There is a [preferences] table in connection.data which is used for storing the default processlist query.

CREATE TABLE IF NOT EXISTS [preferences] (
[name] VARCHAR(50) DEFAULT '' NOT NULL PRIMARY KEY UNIQUE,
[value] TEXT DEFAULT '')

The ‘server_names’ table is used for storing all the connection details.

CREATE TABLE IF NOT EXISTS [server_names] (
[id] INTEGER DEFAULT '' NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
[name] VARCHAR(255) DEFAULT '' NOT NULL,
[username] VARCHAR(255) DEFAULT '' NOT NULL,
[password] VARCHAR(255),
[port] INTEGER(5) DEFAULT '' NOT NULL,
[host] VARCHAR(255) DEFAULT '' NOT NULL,
[is_repl] INTEGER(5) DEFAULT 0 NOT NULL,
[is_capture] INTEGER(5) DEFAULT 0 NOT NULL,
[capture_interval] INTEGER(8) DEFAULT '' NOT NULL,
[username_system] VARCHAR(255) DEFAULT '' NOT NULL,
[authtype_system] INTEGER(5) DEFAULT 0,
[password_system] VARCHAR(255),
[publickey_system] BLOB,
[privatekey_system] BLOB,
[passphrase_system] BLOB,
[port_system] INTEGER(5) DEFAULT 22 NOT NULL,
[is_selected] INTEGER(5) DEFAULT 0 NOT NULL,
[to_email] VARCHAR(255) DEFAULT '' NOT NULL,
[is_sendmail] INTEGER(5) DEFAULT 0 NOT NULL,
[is_sendnoeventmail] INTEGER(5) DEFAULT 0 NOT NULL,
[min_sendmail_interva]l INTEGER(11) DEFAULT 0 NOT NULL,
[warmup_time] INTEGER(11) DEFAULT 0 NOT NULL,
[purging_limit] INTEGER(11) DEFAULT 0 NOT NULL,
[server_os] VARCHAR(255) DEFAULT '' NOT NULL,
[query_capture_interva]l INTEGER(11) DEFAULT 1 NOT NULL,
[is_tunne]l INTEGER(5) DEFAULT 0 NOT NULL,
[host_tunnel] VARCHAR(255) DEFAULT '' NOT NULL,
[host_system] VARCHAR(255) DEFAULT '' NOT NULL,
[username_tunne]l VARCHAR(255) DEFAULT '' NOT NULL,
[authtype_tunne]l INTEGER(5) DEFAULT 0,
[password_tunnel] VARCHAR(255),
[publickey_tunnel] BLOB,
[privatekey_tunnel] BLOB,
[passphrase_tunne]l BLOB,
[port_tunnel] INTEGER(5) DEFAULT 22 NOT NULL,
[same_as_tunnel] INTEGER(5) DEFAULT 0 NOT NULL,
[base_time] INTEGER(11) DEFAULT 0 NOT NULL,
[fileread_directorsftp] INTEGER(11) DEFAULT 0 NOT NULL,
[is_sshneeded] INTEGER(11) DEFAULT 0 NOT NULL,
[ismysql_516] INTEGER(11) DEFAULT 0 NOT NULL,
[slowquery_logpath] VARCHAR(255) DEFAULT '' NOT NULL,
[slowquery_destination] VARCHAR(255) DEFAULT '' NOT NULL,
[slowquery_logstatus] INTEGER(11) DEFAULT 0 NOT NULL,
[slowquery_longquerytime] INTEGER(11) DEFAULT 0 NOT NULL,
[slowquery_logqueriesnotusingindexes] INTEGER(11) DEFAULT 0 NOT NULL,
[generalquery_logpath] VARCHAR(255) DEFAULT '' NOT NULL,
[generalquery_logdestination] VARCHAR(255) DEFAULT '' NOT NULL,
[generalquery_logstatus] INTEGER DEFAULT 0 NOT NULL,
[sniffer_status] INTEGER DEFAULT 0 NOT NULL,
[sniffer_interval] INTEGER DEFAULT 0 NOT NULL,
[sniffer_purgelimit] INTEGER DEFAULT 0 NOT NULL,
[sniffer_user] VARCHAR(255) DEFAULT '' NOT NULL,
[sniffer_host] VARCHAR(255) DEFAULT '' NOT NULL,
[sniffer_timetaken] INTEGER DEFAULT 0 NOT NULL,
[sniffer_query] VARCHAR(255) DEFAULT '' NOT NULL,
[sniffer_is_processlist] INTEGER(11) DEFAULT 0 NOT NULL,
[sniffer_proxy_port] INTEGER(5) DEFAULT 4040 NOT NULL,
[sniffer_proxy_host] VARCHAR(255) DEFAULT 'localhost' NOT NULL)")

Connections management by database manipulations.
You can make use of this information to create a script or application to manage connections without using the MONyog ‘register servers’ GUI or simply (in some cases) perform operations from the file system manually (NOTE: please make sure that MONyog is stopped before performing any of the operations).

Examples: You can for instance easily:
* create a new connection by creating a folder with an unused 4-digit numerical name, create connections.data databases, populate it with connection and MONyog version details details and also create an empty mysql.data database (with structure but without data). Also an empty system.data and sniffer.data database are required if you want to monitor Linux system data and use the Query sniffer.
* clone a connection by copying connection.data from an existing connection.
* edit connection details (ip, port etc.) by updating the respective value in connection.data.

After a MONyog restart changes will have effect.

f) processlist:
Also MONyog processlist feature uses a SQLite MEMORY table (for every server). The table structure is like this

CREATE TEMPORARY TABLE IF NOT EXISTS [processlist](
[Id] INTEGER NOT NULL PRIMARY KEY,
[User] TEXT,
[Host] TEXT,
[Db] TEXT,
[Command] TEXT,
[Time] INTEGER,
[State] TEXT,
[Info] TEXT,
[Action] TEXT)

So that is how the MySQL processlist display in MONyog – unlike when connected to MySQL directly – can be filtered, sorted etc. by using WHERE, ORDER BY, GROUP BY etc. with a SELECT query against the MONyog [processlist] table. But as it is a MEMORY table you can only query it from inside the MONyog processlist interface.

g) MONyog counters and advisors:
Also the MONyog counters and advisors are stored in a SQLite database named [MONyog.res]. Inside it you find a single table [resources]. This database is different from the other databases mentioned in this document in two respects:
* this is a static database that ships with MONyog. It does not update (except for what is explained with [change_flag] column below).
* it is stored in the program installation folder on all platforms.

The [resources] table reads like this:

CREATE TABLE [resources](
[res_lastwritetime] INTEGER,
[res_name] VARCHAR(128) PRIMARY KEY,
[res_content] BLOB,
[change_flag] INTEGER DEFAULT '0')

The [res_content] column stores the javascript for each counter. The [change_flag] column tells if the counter has been modified by user. In case you have customized counters you can backup the [resources] table before upgrading the program and restore the rows you have changed after a program upgrade. The reason why [res_content] column is a BLOB and not a TEXT is that other ‘resources’ (like HTML snippets, small images etc.) of which some are binary data are also stored here.

Thanks to Manohar, Manoj and Chirag for contributing heavily to this Blog!


MONyog 3.12 Has Been Released

peter_laursen

Important note when upgrading from versions before 3.1:
* MONyog now requires a registration code.
* Do not forget to replace the MONyog.lua script if you use the Query Analyzer with proxy-based sniffing.
* RPM users must uninstall pre-3.1 versions before installing this one.
Please read 3.1 release notes for details.

Changes as compared to 3.11 include:

Features:
* All charts displayed by MONyog can now be exported as PDF/JPG/PNG (from chart context menu).
* Query Analyzer will now sort in descending order as default first time (before it was ascending).

Bug fixes:
* Validation of connection details was not proper when saving.
* In Query Analyzer options that do not apply for sniffer and log files are now disabled where they do not apply.
* In Query Analyzer ’show details’ did not preserve the original formatting of a query.
* Max column in sniffer output in Query Analyzer could show erroneous values in some cases.
* Mail alerts sent by MONyog displayed TRIAL at bottom even after registration of MONyog.
* Various errors like “ErrCode:-1 ErrMsg:PathMgr::GetExeName readlink failed” could occur in MONyog.log. In some cases the error would cause failure to register.
* Sniffer data are purged automatically as per the server ‘retention timeframe’ setting, but it could also happen that Sniffer data that were not old enough to qualify for purging were deleted automatically. This would result in some queries missing after analyzing.
* Wrong error was logged by sniffer if MONyog.lua version 3.0 was used with MONyog version 3.1. However in connection details section, on “Test Proxy”, proper error was thrown.

Changes as compared to 3.12 beta include:

Bug fix:
* It was only possible to export the same chart once unless refreshing the page.

Miscellaneous/known issues:
* Due to a bug in specific builds of the MySQL proxy version 0.72 (it returns incorrect version) MONyog Query Analyzer will not work with those builds affected. Affected builds include versions for Windows and OS-X (but not Linux where this MONyog release works fine with proxy 0.72). We hope that MySQL will fix this soon, but if not we will consider a patch in MONyog itself.
* With Internet Explorer versions 8.0.6001.18783 and higher  (latest available for Vista and Win7) exporting graphics will not work. The ‘Save’ button (a FLASH object) does nothing in those browsers. We will release again as soon as a fix is possible.

Downloads: http://webyog.com/en/downloads.php
Purchase: http://webyog.com/en/buy.php


Does MySQL care about Windows users?

peter_laursen

Well .. management does!

Sun/MySQL executives have at many occasions made it clear that Windows is very important for them.
Jonathan Schwartz: http://blogs.sun.com/jonathan/entry/winds_of_change_are_blowing
Robin Schumacher: http://dev.mysql.com/tech-resources/articles/mysql_on_windows.html

This is a very clear signal from management! Windows is an important platform and it is important for MySQL too. And you will find similar statements from key executives of MySQL. But do MySQL developers care about the signals from their management? Not much! Management is farther away than a small town in Russia (Danish slang for ’something we need not care about’) and Windows users are at a small village at some even more remote place!

Symptoms

1)
Examples of carelessness to users’ data:
http://bugs.mysql.com/bug.php?id=36493
http://bugs.mysql.com/bug.php?id=46258

These are the bugs that reflect carelessness in developing Windows specific software components. It is not a small detail – it is very fundamental for Windows. Configuration data etc.  are the property of the user – not the property of the MySQL installer!

2)
Issues with installers for Windows and the Configuration Wizard. Let us list a few (but there are dozens – search yourself):
http://bugs.mysql.com/bug.php?id=42820
http://bugs.mysql.com/bug.php?id=44073
http://bugs.mysql.com/bug.php?id=44073

Reality is that due to this, MySQL software is close to useless for lot of Windows users – should they be hit  by any of those issues – unless they get help to understand what is happening  (what they won’t get from MySQL – but many a times from us through our forums and support ticket system). Users are even scared when the Configuration Wizard returns the message ‘failed to apply security settings’.

All this started more than 2 years ago. Very little activity since then. It seems that MySQL developers think that this is too trivial to spend time on and that those people bothering about reporting such issues must be a bunch of teenage amateurs. They may be (some are!). But that does not a excuse not taking concerns seriously. It is true that all the issues are not very serious if you understand what is going on. But those users that don’t, hurry to uninstall everything related to MySQL (’failed .. security’ – Windows users are scared about that). Actually it is also a problem for us as a 3rd party vendor. People claim occasionally to our support that “SQLyog is insecure because I can connect to MySQL without using the password I have just defined when installing the server”. Every time we have to explain users that it is the Configuration Wizard that is insecure, and that with SQLyog (or any client) it is simple to do what the Configuration Wizard failed to do.

3)
‘lower_case_table_names’ server variable is seriously broken since MySQL 4.0 and it gets worse every day. ’lower_case_table_names=2′ configuration setting in Windows is the only reasonable way with MySQL to ensure table naming integrity across platforms (you will not use the name ‘thisissometable’ but ‘ThisIsSomeTable – because the latter is much more readable. Also in any programming language you would use letter-case conventions to make code readable).

Examples on this:
lower_case_table_names is non-functional with VIEWS: http://bugs.mysql.com/bug.php?id=20356
lower_case_table_names is non-functional with BACKUP/RESTORE: http://bugs.mysql.com/bug.php?id=46266

Also here reports have existed for years with no activity.

4)
Existing GUI tools are effectively discontinued before something else is properly in place. Most MySQL Administrator bug reports get classified as “won’t fix” because every feature in MA is planned to be migrated into Workbench. Same applies to Query Browser, but that worries me less as I have never really been able to use that program a meaningful way. The MA Tray Applet in particular is almost indispensable for Windows users developing and testing an application that is supposed to work with more MySQL versions and different configurations. Now Windows users are left in a vacuum. Existing software deteriorate, new one not functional (frankly in my opinion it will take very long time before it will, if it ever will. But Workbench developers of course have more positive expectations). This actually applies to users on all platforms, but it is my clear impression that  the GUI-tools – and MA in particular – are used most extensively by Windows users.

5)
Specifically there seems to be quite a lot of issues that are related to 64 bit Windows. Some of the issues in category 2) may be and with issues in category 4) it is particularly annoying that the MA tray applet start/stop/configure service does not work on 64 bit systems. It simply fails to connect to Windows Service Manager on such systems.

http://bugs.mysql.com/bug.php?id=44993
http://bugs.mysql.com/bug.php?id=45050

Also in http://bugs.mysql.com/bug.php?id=44993 I had the reply “Windows 7 is an unsupported platform”. True that Win7 is not listed in the manual as a supported Operating System, but is OpenSuSE 11.2? Could you imagine a report with OpenSuSE 11.2 (that is not even an alpha – just a ‘developer milestone’) being rejected because of being “an unsupported platform”? Never!

Fact is that Win7 is now shipping and before the end of this year it will probably be the dominating Windows Operating System. And in relation to the matter that was discussed, there is no difference between Vista and 7. I refuse to believe that this is neither ignorance or just stupid formalism. It is a bad excuse only for doing nothing (and I do not blame the supporter, because I do not believe she took the decision herself).

Wake up to reality please! Win7 64-bit is the state-of -art Windows OS. MySQL missed the Vista train (it took almost one year before MySQL took Vista seriously) – don’t miss the 7-train because of sleeping too long!

6)
Miscellaneous issues affecting Windows but not most Unix:
http://bugs.mysql.com/bug.php?id=31109
http://bugs.mysql.com/bug.php?id=43184
http://bugs.mysql.com/bug.php?id=43273
http://bugs.mysql.com/bug.php?id=45996

activity? nonono …

It is disputable of course how serious those are. Anyway one of those was a complete ‘showstopper’ for me some months ago. But that is not the point here.  The point is that every time (some) MySQL people observe that Windows cannot be fully controlled from a ‘cmd.exe’ prompt or a  Cygwin console they are overwhelmed by surprise!

So those were the symptoms, but what are the reasons?

A MySQL developer wrote to me lately “Mostly I develop on Linux. Sometimes I have to test on Windows. I never cared about [some specific configuration option] and never had problems. The main problem may be that most MySQL developers share this experience. Recently I was asked to develop cross-platform tests [..]. Someone mentioned that [the above mentioned configuration option] should be tested too. This was the moment when all the problems started. I found a bunch of problems. Partly ridiculous simple oversights. I found most were reported as bugs already …” and he advised that I should for instance blog about this to get attention because the bug reports only or mainly affecting Windows users are effectively ‘on ice’.

These are the culprits of the problem:
1) Unit-testing on Windows is not done during development. Development happens on Linux (and lately Solaris) and then ‘we’ can just afford a few hours to check on Windows. It fails of course because it is too late.
2) Also there seems to be no system that overall management guidelines have effect in the organisation of MySQL as regards to considering Windows important. People are allowed to go on with the attitude ‘should I really care about windows’. I do not claim that everybody has this attitude – not even the majority.  But if only a few core people have it is enough to be destructive.
3) Finally I have also noticed that supporters replying to bug reports will often not install MySQL as a service but start it as a user program instead. If the issue is that “SELECT 7″ returns ‘8′ instead of ‘7′ that of course does not matter. But for other reports it may do. For instance this one:
.. what is only reproducible when MySQL runs as a service with system privileges (and no doubt .. I myself was just as stupid as the MySQL people involved!) . That would have taken 2 minutes to sort out only if MySQL people use Windows (and even MySQL software for Windows) as Windows users do. But they treat Windows as an OS that is managable from ‘cmd.exe’ just like Unix is managable from a console or shell.  It is not the case.

Sometimes complete ignorance about Windows is exposed. One such example (no link and no name mentioned): A user reported some issue that MySQL would not start as a service on Windows. A MySQL person replied “On FreeBSD the script that starts the server does like this …”.

Sigh!!


MONyog 3.12 beta 1 Has Been Released

peter_laursen

Important note when upgrading from versions before 3.1:
* MONyog now requires a registration code.
* Do not forget to replace the MONyog.lua script if you use the Query Analyzer with proxy-based sniffing.
* RPM users must uninstall pre-3.1 versions before installing this one.
Please read 3.1 release notes for details.

Changes (as compared to 3.11) include:

Features:
* All charts displayed by MONyog can now be exported as PDF/JPG/PNG (from chart context menu).
* Query Analyzer will now sort in descending order as default first time (before it was ascending).

Bug fixes:
* Validation of connection details was not proper when saving.
* In Query Anlayzer options that do not apply for sniffer and log files are now disabled where they do not apply.
* In Query Analyzer ‘show details’ did not preserve the original formatting of a query.
* Max column in sniffer output in Query Analyzer could show erroneous values in some cases.
* Mail alerts sent by MONyog displayed TRIAL at bottom even after registration of MONyog.
* Various errors like “ErrCode:-1 ErrMsg:PathMgr::GetExeName readlink failed” could occur in MONyog.log.  In some cases the error would cause failure to register.
* Sniffer data are purged automatically as per the server ‘retention timeframe’ setting, but  it could also happen that Sniffer data that were not old enough to qualify for purging were deleted automatically. This would result in some queries missing after analyzing.
* Wrong error was logged by sniffer if MONyog.lua version 3.0 was used with MONyog version 3.1. However in connection details section,on “Test Proxy”, proper error was thrown.

Miscellaneous:
* Due to a bug in specific builds of the MySQL proxy version 0.72  (it returns incorrect version) MONyog Query Analyser will not work with those builds affected.  Affected builds include versions for Windows and OS-X (but not Linux where this MONyog release works fine with proxy 0.72). We hope that MySQL will fix this soon, but if not we will consider a patch in MONyog itself.

Downloads: http://webyog.com/en/downloads.php
Purchase: http://webyog.com/en/buy.php


SQLyog 8.13 beta3 Has Been released

peter_laursen

Changes (as compared to beta 2) include:

Bug Fixes:
* The fix in beta 2 with  TIMESTAMP ON UPDATE and Data Sync introduced a new issue.  An additional  `backquote` could be generated in statements  for tables having a TIMESTAMP column – what would cause failure to sync affected table.
* If user did not have SELECT privilege to the `mysql`.`proc` table ALTER STORED PROCEDURE/FUNCTION failed silently. Actually nothing happened. Now we return an error. Please read this FAQ to understand the privilege issue with ALTER STORED PROCEDURE/FUNCTION in SQLyog.

Downloads: http://webyog.com/en/downloads.php
Purchase: http://webyog.com/en/buy.php


SQLyog 8.13 beta 2 Has Been Released

peter_laursen

Changes (as compared to 8.13 beta 1) include:

Features:
*  When updating from DATA or RESULT grid the UPDATE statement will now only list columns that were changed.  That results in more readable statements and  may also improve performance with ‘wide’ tables and tables with large BLOB/TEXT columns.
* As a consequence of the above the restriction, that a grid containing spatial or binary data could not be updated, has been lifted (but such columns themselves still cannot be updated from the grid).
* Added an option to perform backups in a single transaction (similar to ‘mysqldump’ “–single-transaction” option).
* The connection manager has been redesigned to allow for longer connection names.  Also the ‘…’ button was renamed to ‘rename’ (what was what it always did).
* Added support for MySQL compressed protocol in both SQLyog GUI and SJA. Please see detailed note below.
* Added an option  for user to specify the timeout setting for the session (note: it will work with MySQL 5.0 and up only as earlier versions do not support SESSION variables). Please see detailed note below.
* Now SQLyog logs to the sqlyog.err file if memory allocation fails with string manipulation (for example when handling blob/text data where a single value may be larger than available memory).
* Version parameter was added to SJA. You can now execute “sja –version” or “sja -v” and version will be returned. Before only the file size could be used to detect the SJA version.
* Now full GUI support for all charsets added to MySQL after 5.1. Everwhere SQLyog presents user for a list of available charsets and collations the server will be queried about this information. Before it was not like that everywhere!
* If the custom size for bulk insert in ‘preferences’ is greater than server default, then SQLyog will use the server default for generating BULK INSERT statements.  Users overlooked/forgot that they had specified a setting.  As a result backups that would not restore on same server could occur. Also now user specification is restricted to 5 digits (what means it will have to be less than 100 MB).
* The various options available for backups have been reorganised in GUI to make it more clear what options have effect on the source server while backup job  is running and what options are options that are written to the file.
* A new query tab can now be opened by double-clicking in the unused space to the right of existing open tabs.

Bug Fixes:
* SQLyog could fail to save properly from RESULT tab if PK-column(s) were not displayed in GRID (an incorrect WHERE-clause was generated). This bug was introduced in 8.1.
* Data Sync could throw an incorrect ‘AUTO INCREMENT definition mismatch’ error for data types (like TIMESTAMP type) where auto-increment does not apply with specific schemas.  Also this bug affected Schema Sync.
* Fixed a crash in Scheduled Backup.
* A scheduled SJA job raised an internal error code in the Windows scheduler. It had no effect on the job as such (queries were executed, mails were sent), but various monitoring tools for Windows servers would raise an alert.
* Emptying a database rendered Autocomplete non-functional for the session.
* Fixed an issue  with Schema Sync if the same ‘stored program’ was formatted differently on source and target. Target was not always synced properly and SS would detect differences forever.
* On Wine Data Sync could pop up a message that SJA had crashed.  But actually it only crashed after user clicked OK in the dialogue.

Miscellaneous:
* SQLyog reconnects are now coded differently.  The new code means that with SSH-tunnel it will now not be necessary to re-instantiate PLINK (the running PLINK instance will be used).

Additional comments:
* DO NOT take for granted that use of compressed protocol will always increase performance, because the truth is that most often it will make things slower. Use of compressed protocol will decrease the amount of data to be transferrred over the network, but it will result in additional load on both the server and the client (due to compressing and uncompressing).  You should never use the option when connecting to MySQL on local machine, on local network or over a fast Internet connection.  With slower connections however using this option may improve overall performance.  It is impossible to be more specific as most Internet connections have asymmetric properties that differ across Internet providers and telecom companies.
* The option to define timeout for the session (different from the global setting) is possible with MySQL servers from 5.0 and up.  However most users will not need to care about it – not even if server (global) timeout setting is low.  SQLyog will reconnect if connection was lost since last query was run.  Most often user does not even notice.  However we have reports of situations where the network takes very long time to process such reconnect requests.  In this situation setting the timeout from the client will prevent the situation to occur. Also SSH-users connecting to SSH  servers/daemons that are slow to establish connection and where MySQL has a low timeout setting can use this option with advantage.

Downloads: http://webyog.com/en/downloads.php
Purchase: http://webyog.com/en/buy.php