How do I see the last command issued in mysql? - mysql

I issued a query and got results at the mysql> command line.
Is there any way (other than edit) that I can see what the last query was?
I vaguely remember that in Oracle pl/sql you could just type list but that command isn't available (syntax error) in mysql

Additionally, for those blessed with MySQL >= 5.1.12:
Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';
Take a look at the table mysql.general_log
If you prefer to output to a file:
SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';
I prefer this method because:
you're not editing the my.cnf file and potentially permanently turning on logging
you're not fishing around the filesystem looking for the query log - or even worse, distracted by the need for the perfect destination. /var/log /var/data/log /opt /home/mysql_savior/var
restarting the server leaves you where you started (log is off)
For more information, see
http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_general_log

Related

How to enable --general-log without restarting the MYSQL server?

According to the mysql documentation this flag is possible to change dynamically.
Property Value
Command-Line Format --general-log
System Variable general_log
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type Boolean
Default Value OFF
But by default this option is disabled. But I need to enable this flag in order to see the logs without restarting the server. What is the way to enable this without restarting the server.
MySQL provides a System variable general_log, which specifies whether the general query log is enabled or not. You will just need to execute the following queries to enable GLOBAL logging (for all the other client sessions as well):
SET GLOBAL general_log = 'ON';
You can also specify the log file path:
SET GLOBAL general_log_file = '/var/log/mysql/all.log';
Remember that when you restart the server, these settings will be lost. To make the changes persistent, you will have to make changes in the configuration file.
If you want to disable the general query logging, you can do the following:
SET GLOBAL general_log = 'OFF'

Enable MySQL syslog to log aborted connections and access-denied

What is the command in mysql that is required to that I can implement aborted connections and access-denied logs to be written to the syslog?
The commands are first to see what your settings are:
select ##general_log; -- a 1 indicates it is turned on for capture
select ##general_log_file; -- the file that it logs to
select ##datadir; -- directory location where the log lives
To turn logging on for the General Query Log, use the following:
SET GLOBAL general_log = 'ON'; -- 0 is off, 1 is on
Note that the datadir is read-only and requires a restart of the server after changes. Basically, don't change this. It is the home of your database schemas.
For expanded connection failures perform a
select ##log_warnings; -- make a note of your prior setting
set global log_warnings=2; -- setting above 1 increases output
The immediate above relates to the Error log written out in the same datadir.
See the Percona article Auditing login attempts in MySQL and my prior answer Here.

Why mysql max_allowed_packet reset to 1m automatically

I set
SET GLOBAL max_allowed_packet=16777216;
and also
[mysqld]
max_allowed_packet = 16M
I checked the max_allowed_packet through below command
SHOW VARIABLES LIKE 'max_allowed_packet';
and the value is = 16777216
But after some days max_allowed_packet automatically reset to 1M.
i am pretty sure that your are hacked. i had the same problem for months. i opened general_log and finally found some codes:
connect root#someipaddress on
Query select 0x4D5A900..........(verylong)
Query select sys_exe('cmd /c c:/windows/nbvqc4.vbs')
.........
set global max_allowed_packet 1024
........
suggestion: change your root password.
MySQL has both GLOBAL variables and SESSION variables, as well as the my.cnf.
GLOBAL variables are initialised on startup from my.cnf, and many variables are taken from the GLOBAL value at connection time and copied into the SESSION. If you change the GLOBAL value, the SESSION keeps it's own value -- but any new sessions will take the new GLOBAL default.
It seems that you did the right thing in terms of setting the GLOBAL variable and updating my.cnf, but in your example you ran "SHOW VARIABLES" which returns the SESSION value. So it is possible you were not checking the correct value in that case. I would recommend for all future checks that you check both the global and session values to help get an idea of what is changing when.
SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';
SHOW SESSION VARIABLES LIKE 'max_allowed_packet';
For the value to change itself later, the following explanations are possible
(1) You are re-using a session that still has the old value
(2) Another connection has run SET GLOBAL max_allowed_packet, it is possible even that some uncourteous application or script is doing this
(3) The server was restarted, and the my.cnf change is not being applied as expected -- perhaps the file is in the wrong path, or the setting exists more than once in the configuration file. I would check the current Uptime in SHOW GLOBAL STATUS to understand if the server was restarted
I cannot think of any other reasons this would occur. I did check to see if the client negotiates the server-side value when you pass --max_allowed_packet but that does not seem to be the case.
Yes, someone hack the system.I changed the root password and everything working fine.
By default value of max_allowed_packet is 1M in MySQL. I believe size of your "max_allowed_packet" is exceed its upper limit. So, when you check "SHOW VARIABLES LIKE 'max_allowed_packet';" its showing some negative value.
Additionally,
You have two values of max_allowed_packet in MySQL :
one on the client side : [mysql] section, [mysqldump], [client] and more.
one on the server side : [mysqld] section.
Try setting 'Super' privilege of all users to 'N', except 1 admin user. This prevents users from changing max_allowed_packet.
We just ran into this issue and the root cause is we were hacked. Some 3rd party was running a script that was changing the value down.
Tip for those trying to figure out if a hack is a root cause for them - temporarily change your MySQL logging to include all queries. That's how we ended up finding the issue.

How do I enable the MySQL slow query log? [duplicate]

This question already has answers here:
How can I enable MySQL's slow query log without restarting MySQL?
(8 answers)
Closed 8 years ago.
My MySQL version details are
Server: Localhost via UNIX socket
Software: MySQL
Software version: 5.0.96-community-log - MySQL Community Edition (GPL)
Protocol version: 10
How do I enable the MySQL slow query log?
Version 5.1.6 and above:
1. Enter the MySQL shell and run the following command:
set global slow_query_log = 'ON';
2. Enable any other desired options. Here are some common examples:
Log details for queries expected to retrieve all rows instead of using an index:
set global log_queries_not_using_indexes = 'ON'
Set the path to the slow query log:
set global slow_query_log_file ='/var/log/mysql/slow-query.log';
Set the amount of time a query needs to run before being logged:
set global long_query_time = 20;
(default is 10 seconds)
3. Confirm the changes are active by entering the MySQL shell and running the following command:
show variables like '%slow%';
Versions below 5.1.6:
Edit the /etc/my.cnf file with your favorite text editor
vi /etc/my.cnf
Add the following line under the “[mysqld]” section. Feel free to update the path to the log file to whatever you want:
log-slow-queries=/var/log/mysql/slow-query.log
3. Enable additional options as needed. Here are the same commonly used examples from above:
Set the amount of time a query needs to run before being logged:
`long_query_time=20
(default is 10 seconds)`
Log details for queries expected to retrieve all rows instead of using an index:
`log-queries-not-using-indexes`
4. Restart the MySQL service:
service mysqld restart
5. Confirm the change is active by entering the MySQL shell and running the following:
show variables like '%slow%';
Update:1
According to MySQL docs, the error #1193 occurs when you use wrong code for SQLSTATE.
Message: Unknown system variable %s
And, as you can see on the same page, the SQLSTATE 99003 is not defined.
refer this link:
http://dev.mysql.com/doc/refman/5.5/en/slow-query-log.html
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
If your server is above 5.1.6 you can set the slow query log in the runtime itself. For which you have to execute this queries.
set global log_slow_queries = 1;
set global slow_query_log_file = <some file name>;
Or alternatively you can set the this options in the my.cnf/my.ini option files
log_slow_queries = 1;
slow_query_log_file = <some file name>;
Refer: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_slow_query_log_file

Mysql Event Not Working

I have added the following simple test event on my mysql database via phpmyadmin:
CREATE DEFINER=`root`#`localhost` EVENT `my_event`
ON SCHEDULE EVERY 1 MINUTE STARTS '2013-05-27 00:00:00'
ON COMPLETION NOT PRESERVE ENABLE DO
BEGIN
UPDATE `test` SET `name`="z";
END
My environment is mac + MAMP Pro. I am expecting to change all rows on my 'test' table with name 'z' within a minute. But not happening so.
Do I have to something additional to get my events start working?
Output of "SHOW PROCESSLIST":
Thanks.
Events are run by the scheduler, which is not started by default.
Using SHOW PROCESSLIST is possible to check whether it is started. If not, run the command
SET GLOBAL event_scheduler = ON;
to run it.
Verify if the event_scheduler is On - execute the following command:
SHOW PROCESSLIST;
It'll output a table/entries, you must look for an entry with User event_scheduler, and Command Daemon:
Id User Host db Command Time State Info
22870 event_scheduler localhost \N Daemon 23 Waiting for next activation \N
OR, you can also verify using the following command:
SELECT ##global.event_scheduler;
The result should be ON, otherwise set it off (will get 0 for the command), as stated in the next section.
If you don't have any such entry (as above), you may start the event scheduler using the following command:
SET GLOBAL event_scheduler = ON;
Once done, you can verify if it has been executed properly using the SHOW PROCESSLIST command, as mentioned above.
For those wondering how to enable it by default at startup, add the following to your config file (my.ini, my.cnf):
#Event scheduler can be set to 1 (On), 0 (Off), or Disabled
event_scheduler=1
Restart of the service is required in this case, so if you want minimal disruption, add this to the config file, and then run the SQL:
SET GLOBAL event_scheduler = ON;
That way, it will run for the current process, and if the server is restarted it will still work.
Note that this doesn't work if the event_scheduler was set to disabled. In that case the only option is to restart the service.
If you want your event_scheduler to startup automatically every time mysql server restarts, anywhere under the [mysqld] section of the my.ini or my.cnf file that you find in /etc/mysql you should place
[mysqld]
# turning on event_scheduler
event_scheduler=ON
restart mysql to check if it is running (in command line terminal!)
sudo service mysql restart
then check your processlist
SHOW PROCESSLIST
you can check if your events are running by checking the last time they ran
SELECT * FROM INFORMATION_SCHEMA.events
Temporal
SET GLOBAL event_scheduler = ON;
Will not work if event_scheduler is explicitly DISABLED, see the method below
Permanent (needs restart)
In your config file (In Ubuntu it's /etc/mysql/mysql.cnf):
[mysqld]
event_scheduler = ON
Notes:
The event_scheduler variable can have this possible states:
OFF (or 0) (default)
ON (or 1)
DISABLED: you cannot use the temporal enabling, you can only change state through the config file and restarting the server
WARNING: Keywords ON / OFF are preferred over their numerical equivalents.
And in fact Mysql Workbench doesn't recognize the configuration event_scheduler=1, it shows as OFF in the Options File section.
Tested in Ubuntu with Mysql Workbench 8.0.17 and Mysql Server 5.7.27
Although ON and OFF have numeric equivalents, the value
displayed for event_scheduler by SELECT or SHOW VARIABLES is always
one of OFF, ON, or DISABLED. DISABLED has no numeric
equivalent. For this reason, ON and OFF are usually preferred
over 1 and 0 when setting this variable.
Source: https://dev.mysql.com/doc/refman/5.7/en/events-configuration.html
I just figured out that on MariaDB, after adding an event (in my case, it was the first one), you have to restart the event-scheduler
SET GLOBAL event_scheduler = OFF;
and then
SET GLOBAL event_scheduler = ON;
to make it actually bring the scheduler into "waiting for activation"-state.
I would just like to add to this thread. I dumped my database to another server and as a result the definer of my event had no such grant defined for the user. I updated my definer with
ALTER DEFINER='root'#'localhost' EVENT event.name COMMENT '';
Make sure your definer has the correct PRIVILEGES.
Remember to add in 'Commit', after 'DO BEGIN' or 'DO'. Works for me after that.
Try
SET GLOBAL event_scheduler = ON;
DELIMITER $$
CREATE DEFINER=`root`#`db01` EVENT `PRICEALERT_STATUS`
ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE)
DO BEGIN
// Your Query
END $$
DELIMITER ;