> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Sent: Friday, September 23, 2005 09:40
> To: Jeff
> Cc: mysql@lists.mysql.com
> Subject: RE: MyISAM to InnoDB
> 
> 
> Sorry to butt in but I wanted to make sure you didn't do 
> actually do what 
> you proposed to do, yet. More responses interspersed...
> 

Nope nothing yet, I don't rush things when I'm unsure... ;o)

> "Jeff" <[EMAIL PROTECTED]> wrote on 09/23/2005 08:32:57 AM:
> 
> > > -----Original Message-----
> > > From: Devananda [mailto:[EMAIL PROTECTED]
> > > Sent: Thursday, September 22, 2005 19:03
> > > To: Jeff
> > > Cc: mysql@lists.mysql.com
> > > Subject: Re: MyISAM to InnoDB
> > > 
> > > 
> > > Jeff wrote:
> > > >>-----Original Message-----
> > > >>From: Devananda [mailto:[EMAIL PROTECTED]
> > > >>Sent: Thursday, September 22, 2005 16:14
> > > >>To: Jeff
> > > >>Cc: mysql@lists.mysql.com
> > > >>Subject: Re: MyISAM to InnoDB
> > > >>
> > > >>
> > > >>Jeff wrote:
> > > >>
> > > >>>True, is there a way to tell a slave to not replicate
> > > >>
> > > >>certain queries
> > > >>
> > > >>>like alter table or would I need to get creative and stop
> > > >>
> > > >>replication
> > > >>
> > > >>>and all writes to the main database, then issue the 
> alter table 
> > > >>>statement, then restart replication with a  set global 
> > > >>>slave_sql_skip_counter=1 so that it skips the alter statemtent?
> > > >>
> > > >>There's a much easier way - issue the statement "SET 
> SQL_LOG_BIN = 
> > > >>0;" before issuing any ALTER TABLE statements. This 
> will cause all
> > > >>statements for the duration of that session to not be 
> > > written to the
> > > >>binlog. See http://dev.mysql.com/doc/mysql/en/set-option.html
> > > >>for more 
> > > >>information.
> > > >>
> > > > 
> > > > 
> > > > First off, thanks for the help to you and Bruce both!
> > > > 
> > > You're quite welcome, Jeff :)
> > > 
> > > > When you say here, "for the duration of that session" does
> > > that mean
> > > > that only queries I issue with my connection skip the
> > > binlog?  Or do
> > > > all queries during that time skip the binlog.  In other
> > > words, when I
> > > > SET SQL_LOG_BIN = 0; should I first stop all applications
> > > writing to
> > > > the database to prevent missing data in the slaves?
> > > > 
> > > 
> > > 
> > > It only affects that connection. Bruce wrote a response 
> at about the
> > > same time I did; his covers this topic as well. SQL_LOG_BIN 
> > > is a session 
> > > variable, meaning that it only affects the current session 
> > > (connection). 
> > > So, any applications running at the same time will not be 
> > > affected by a 
> > > change to this variable, and if you close your client and 
> > > reconnect, you 
> > > will have to set the variable again. As Bruce suggested, 
> it's best to 
> > > set it only when you need it and unset it immediately 
> > > afterwards (as a 
> > > precaution against operator error, not because it affects 
> the server).
> > > 
> > > I do want to point out that while the commands you issue
> > > (after setting 
> > > SQL_LOG_BIN to 0) will not be written to the binlog (thus 
> > > will not run 
> > > on any slave reading from this server), they may affect 
> other running 
> > > processes on the server. If, for example, you run an 
> ALTER TABLE on a 
> > > table currently in MyISAM format, the table will be 
> locked and all 
> > > processes running on that server that read from / write 
> to that table 
> > > will wait until that ALTER finishes. Setting SQL_LOG_BIN 
> to 0 doesn't 
> > > affect this in any way - it _only_ affects whether statements 
> > > from that 
> > > specific session are recorded in the binary log.
> > > 
> > 
> > Thanks, that answer my question regarding SQL_LOG_BIN varialbe.
> > 
> > > Side question - you've stated that you are planning to migrate to
> > > InnoDB, but you haven't said anything to the list about 
> how much data 
> > > you have. Just be aware that it can take a lot of time 
> and disk space 
> > > for MySQL to transfer all your data from one format to 
> the other (of 
> > > course depending on how much data you have) and if anything 
> > > goes wrong 
> > > during that time, the results will probably not be what you 
> > > expect, or 
> > > want. I would advise you to at least investigate an alternate 
> > > approach 
> > > if you have a lot of data - take the server you are going to 
> > > migrate out 
> > > of the 'cluster' and make sure it is not processing any data / no 
> > > clients are connecting to it; dump all your data to text files, 
> > > preferably separating your data definition statements (ie 
> > > CREATE TABLE 
> > > statements) from your actual data; modify the CREATE 
> statements to 
> > > specify the InnoDB engine; lastly load all the data from the 
> > > text files 
> > > into MySQL, and bring this server back into the 'cluster'.
> > > 
> > > If you don't have a _lot_ of data, then it may not be 
> worth all that
> > > work. Of course, "a lot" is subjective; I'd say, based purely 
> > > on my own 
> > > experiences with this, that if you are going to migrate 1G of 
> > > data, you 
> > > will probably be better off exporting / alter the text files / 
> > > importing. If you have 10's or 100's of G of data, I 
> would strongly 
> > > recommend that you do it this way. And regardless of how much 
> > > data you 
> > > have, it is, IMHO, safer to export/import. 
> > 
> > Well like you say a "lot" of data is subjective.  Our situation is 
> > this; we currently have a DB01 up and running and in production.  
> > We're moving to a more redundant data center and have purchased new 
> > hardware to migrate the database to (new server will be DB03).  The 
> > speed of the database directly affects our profitability.  
> This being 
> > the case I've suggested to our developers that we take the 
> opertunity 
> > to migrate the tables involved in heavy write actions from 
> MyISAM to 
> > InnoDB on the new DB03 server before we put it into production.  
> > Currently I have DB03 up and running (all MyISAM) at the new 
> > datacenter and doing circular replication with DB01 over 
> VPN.  No apps 
> > or users are currently writing or even reading from DB03 yet.
> > 
> > Even if we migrate selected tables in DB03 to InnoDB I'd 
> like to keep 
> > the downstream (one way) replicated servers using MyISAM as most of 
> > the activity on those is read only.
> > 
> > As for the size of the tables in question, they are currently;
> > 
> > 2gig Table1.MYD
> > 200M Table1.MYI
> > 14k  Table1.frm
> > 
> > 422k Table2.MYD
> > 114k Table2.MYI
> > 11k  Table2.frm
> > 
> > Our lead developer here has made the statement, "why not 
> just convert 
> > the entire db to InnoDB for the sake of simplicity and ease?"
> 
> The tables in the mysql database cannot be InnoDB. InnoDB 
> does not yet 
> support fulltext searching. Other than those two major 
> restrictions, a 
> full InnoDb setup is possible.
> 

Shawn,

What do you mean by "The tables in the mysql database cannot be InnoDB?"
You kinda lost me there...

> > As far as
> > I'm concerned, simplicity and ease would be to leave it as is but 
> > we're looking to eek out as much speed in our transactions 
> as possible 
> > so simplicity, ease and performance don't always go together.
> > 
> > If I understand what your suggesting above I should:
> > 
> > 1) Stop all writes/read to the table (just replication at 
> this point)
> 
> STOP SLAVE should be all you need. You don't need to worry 
> about reads 
> affecting either your data or your structures. 
> http://dev.mysql.com/doc/mysql/en/stop-slave.html
> 
> > 
> > 2) Issue a "show create table" statement for Table1 and 
> Table2, save 
> > these results and modify the engine type to InnoDB for later use.
> > 
> > 3) Dump all data from Table1 and Table2 to text files.
> 
> You are doing this more as a backup measure than as a step in the 
> conversion process. 

Yes, you are correct but it was suggesed by Devananda that this was a
"safer" approach.
I'm in no rush so safer is better.

> 
> > 
> > 4) Setup the db for InnoDB use (add variables to my.cnf 
> file as needed 
> > to support InnoDB).
> 
> This is a great time for you to decide if you want to use 
> file-per-tablespace or the single tablespace model of InnoDB. 
> There are 
> advantages to each. Pick which one works best for your situation.

Actually it's not a choice right now as the MySQL version running on
these servers is 4.0.16 which I believe doesn't support single
tablespace.  I do plan on moving to that however after upgrades as it
seems a more easily managed InnoDB setup.  I suspect backups of a InnoDB
db with a single tablespace model would be easier as well?

> > 
> > 5) Restart the database (make sure replication doesn't start)
> > 
> > 6) Issue a SQL_LOG_BIN=0
> 
> Good, this means that the binlog won't get the next few commands.
> 
> > 
> > 7) Drop the old Table1 and Table2
> > 
> > 8) Use the previousely created "create table" queries to rebuild 
> > Table1 and Table2 in InnoDB
> > 
> > 9) Re-import the data from the text files into the new Table1 and 
> > Table2
> 
> Nope. That's overkill. All you need to do is to issue ALTER TABLE 
> statements where you change ENGINE=myISAM to ENGINE=InnoDB. Looks 
> something like this:
> 
> ALTER TABLE mytable1 ENGINE=InnoDB;
> 
> MySQL will take care of copying over the column definitions 
> and moving the 
> data from one set of files (the MyISAM files) into the 
> appropriate InnoDB 
> structures.
> http://dev.mysql.com/doc/mysql/en/alter-table.html
> http://dev.mysql.com/doc/mysql/en/create-table.html
> 
> > 
> > 10) Issue a SQL_LOG_BIN=1
> > 
> > 11) Restart replication.
> > 
> > If you're
> > 
> > > interested, I would
> > > be happy to talk more about a method to automate this process 
> > > over many 
> > > tables / lots of data.
> > > 
> > > 
> > > Best Regards,
> > > Devananda vdv
> > > 
> > 
> > I'd be very interested to discuss that. Even if I don't use 
> it in this 
> > particular situation, knowledge never hurts! ;o)
> > 
> > Thanks!
> > 
> > jeff
> > 
> > 
> 
> Yep, that sounds like it will work. 
> 
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
> 



-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to