Author: jstephens
Date: 2007-12-07 21:20:17 +0100 (Fri, 07 Dec 2007)
New Revision: 9202
Log:
Fixes to mysql-cluster-replication-conflict-resolution
Added missing mysqld options to optvars file
(Thanks, Oli!)
Modified:
trunk/dynamic-docs/command-optvars/mysqld.xml
trunk/refman-5.1/mysql-cluster-cge-building-tmp.xml
trunk/refman-5.1/mysql-cluster-replication.xml
trunk/refman-6.0/mysql-cluster-replication.xml
Modified: trunk/dynamic-docs/command-optvars/mysqld.xml
===================================================================
--- trunk/dynamic-docs/command-optvars/mysqld.xml 2007-12-07 19:59:29 UTC (rev 9201)
+++ trunk/dynamic-docs/command-optvars/mysqld.xml 2007-12-07 20:20:17 UTC (rev 9202)
Changed blocks: 14, Lines Added: 149, Lines Deleted: 93; 10132 bytes
@@ -10666,74 +10666,73 @@
</versions>
</mysqloption>
-
+
<mysqloption section="security" id="max_prepared_STATEMENT_count">
-
+
<xrefto id="option_mysqld_max_prepared_STATEMENT_count"/>
-
+
<name>max_prepared_STATEMENT_count</name>
-
+
<shortdescription lang="en">
- This variable limits the total number of prepared statements in the server
+ This variable limits the total number of prepared statements in
+ the server
</shortdescription>
-
+
<types>
<vartype class="system" isdynamic="no" scope="global" format="max_prepared_STATEMENT_count"/>
</types>
-
-
+
<versions>
<manual version="5.1"/>
<introduced version="5.1.10"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
-
+
<mysqloption section="security" id="prepared_STATEMENT_count">
-
+
<xrefto id="option_mysqld_prepared_STATEMENT_count"/>
-
+
<name>max_prepared_STATEMENT_count</name>
-
+
<shortdescription lang="en">
The current number of prepared statements
</shortdescription>
-
+
<types>
<vartype class="system" isdynamic="no" scope="global" format="prepared_STATEMENT_count"/>
</types>
-
-
+
<versions>
<manual version="5.1"/>
<introduced version="5.1.10"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
-
+
<mysqloption section="security" id="local_infile">
-
+
<xrefto id="option_mysqld_local_infile"/>
-
+
<name>local_infile</name>
-
+
<shortdescription lang="en">
Whether LOCAL is supported for LOAD DATA INFILE statements
</shortdescription>
-
+
<types>
<vartype class="system" isdynamic="no" scope="global" format="local_infile"/>
</types>
-
+
<versions>
<manual version="4.1"/>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="server" id="log">
@@ -10768,10 +10767,10 @@
</versions>
</mysqloption>
-
- <!--id already in use-->
-
- <!--mysqloption section="server" id="log">
+
+<!--id already in use-->
+
+<!--mysqloption section="server" id="log">
<xrefto id="option_mysqld_log"/>
@@ -10793,7 +10792,6 @@
</versions>
</mysqloption-->
-
<mysqloption section="server" id="log-bin">
@@ -10820,29 +10818,28 @@
</versions>
</mysqloption>
-
+
<mysqloption section="server" id="log_bin">
-
+
<xrefto id="option_mysqld_log_bin"/>
-
+
<name>log_bin</name>
-
+
<shortdescription lang="en">
Whether the binary log is enabled
</shortdescription>
-
+
<types>
<vartype isdynamic="no" scope="global" class="system" format="log_bin"/>
</types>
-
-
+
<versions>
<manual version="4.1"/>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="server" id="log-bin-index">
@@ -11028,7 +11025,7 @@
<name>log-output</name>
<shortdescription lang="en">
- The destination for general query log and slow query log output.
+ The destination for general query log and slow query log output.
Syntax: log-output[=value[,value...]], where "value" could be
TABLE, FILE, or NONE
</shortdescription>
@@ -12622,28 +12619,28 @@
</versions>
</mysqloption>
-
+
<mysqloption section="server" id="locked_in_memory">
-
+
<xrefto id="option_mysqld_locked_in_memory"/>
-
+
<name>locked_in_memory</name>
-
+
<shortdescription lang="en">
Whether mysqld is locked in memory
</shortdescription>
-
+
<types>
<vartype isdynamic="no" scope="global" class="system" format="locked_in_memory" />
</types>
-
+
<versions>
<manual version="4.1"/>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="server" id="license">
@@ -12688,7 +12685,7 @@
<types>
<optype class="cmdline" format="--merge"/>
<optype class="mycnf"/>
- </types>
+ </types>
<values vartype="boolean" platform="all">
@@ -12761,26 +12758,26 @@
</versions>
</mysqloption>
+
<mysqloption section="myisam" id="myisam_recover_options">
-
+
<name>myisam_recover_options</name>
-
+
<shortdescription lang="en">
The value of the --myisam-recover option
</shortdescription>
-
<types>
<vartype isdynamic="no" class="system" format="myisam_recover_options"/>
</types>
-
+
<versions>
<manual version="4.1"/>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="server" id="multi_range_count">
@@ -13303,28 +13300,28 @@
</versions>
</mysqloption>
-
+
<mysqloption section="ndb" id="ndb-connectstring">
-
+
<name>ndb-connectstring</name>
-
+
<shortdescription lang="en">
- Indicates the management server that distributes the cluster configuration
+ Indicates the management server that distributes the cluster
+ configuration
</shortdescription>
-
+
<types>
<optype class="cmdline" format="--ndb-connect-string" />
<optype class="mycnf"/>
</types>
-
- <values vartype="string" platform="all"/>
-
-
+
+ <values vartype="string" platform="all"/>
+
<versions>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="ndb" id="ndb_extra_logging">
@@ -13419,6 +13416,67 @@
</mysqloption>
+ <mysqloption section="ndb" id="ndb_log_updated_only">
+
+ <xrefto id="option_mysqld_ndb_log_updated_only"/>
+
+ <name>ndb_log_updated_only</name>
+
+ <shortdescription lang="en">
+ Log complete rows (ON) or updates only (OFF)
+ </shortdescription>
+
+ <types>
+ <optype class="cmdline" format="--ndb-log-updated-only"/>
+ <optype class="mycnf"/>
+ <vartype isdynamic="yes" scope="global" class="system" format="ndb_log_updated_only"/>
+ </types>
+
+ <values vartype="boolean" platform="all">
+
+ <value default="ON"/>
+
+ </values>
+
+ <versions>
+ <manual version="5.1"/>
+ <introduced version="5.1.19-ndb-6.3.0"/>
+ <manual version="6.0"/>
+ </versions>
+
+ </mysqloption>
+
+ <mysqloption section="ndb" id="ndb_log_update_as_write">
+
+ <xrefto id="option_mysqld_ndb_log_update_as_write"/>
+
+ <name>ndb_log_update_as_write</name>
+
+ <shortdescription lang="en">
+ Toggles logging of updates on the master between updates (OFF) and
+ writes (ON)
+ </shortdescription>
+
+ <types>
+ <optype class="cmdline" format="--ndb-log-update-as-write"/>
+ <optype class="mycnf"/>
+ <vartype isdynamic="yes" scope="global" class="system" format="ndb_log_update_as_write"/>
+ </types>
+
+ <values vartype="boolean" platform="all">
+
+ <value default="ON"/>
+
+ </values>
+
+ <versions>
+ <manual version="5.1"/>
+ <introduced version="5.1.19-ndb-6.3.0"/>
+ <manual version="6.0"/>
+ </versions>
+
+ </mysqloption>
+
<mysqloption section="ndb" id="ndb_wait_connected">
<xrefto id="option_mysqld_ndb_wait_connected"/>
@@ -16087,28 +16145,27 @@
</versions>
</mysqloption>
-
+
<mysqloption section="server" id="slow_query_log">
-
+
<xrefto id="option_mysqld_slow_query_log"/>
-
+
<name>slow_query_log</name>
-
+
<shortdescription lang="en">
Whether the slow query log is enabled
</shortdescription>
-
+
<types>
<vartype isdynamic="no" class="system" scope="global" format="slow_query_log"/>
</types>
-
-
+
<versions>
<manual version="5.1"/>
<manual version="6.0"/>
<introduced version="5.1.12"/>
</versions>
-
+
</mysqloption>
<mysqloption section="server" id="slow_launch_time">
@@ -18917,7 +18974,6 @@
<types>
<vartype class="system" isdynamic="no" format="named_pipe"/>
-
</types>
<versions>
@@ -18928,30 +18984,30 @@
</versions>
</mysqloption>
-
+
<mysqloption section="server" id="enable-named-pipe">
-
+
<xrefto id="option_mysqld_enable-named-pipe"/>
-
+
<name>named_pipe</name>
-
+
<shortdescription lang="en">
- Enable support for named pipes.
+ Enable support for named pipes.
</shortdescription>
-
+
<platforms applies="windows"/>
-
+
<types>
<optype class="cmdline" format="--named_pipe"/>
<optype class="mycnf"/>
</types>
-
+
<versions>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
<mysqloption section="ndb" id="ndb_index_stat_cache_entries">
@@ -21312,50 +21368,50 @@
</versions>
</mysqloption>
-
+
<mysqloption section="ndb" id="skip-ndbcluster">
-
+
<xrefto id="option_mysqld_skip-ndbcluster"/>
-
+
<name>skip-ndbcluster</name>
-
+
<shortdescription lang="en">
Disable the NDB Cluster storage engine
</shortdescription>
-
+
<types>
<optype class="cmdline" format="--skip-ndbcluster"/>
<optype class="mycnf"/>
</types>
-
+
<versions>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
-
+
<mysqloption section="server" id="one-thread">
-
+
<xrefto id="option_mysqld_one-thread"/>
-
+
<name>one-thread</name>
-
+
<shortdescription lang="en">
Only use one thread (for debugging under Linux)
</shortdescription>
-
+
<types>
<optype class="cmdline" format="--one-thread"/>
<optype class="mycnf"/>
</types>
-
+
<versions>
<manual version="5.0"/>
<manual version="5.1"/>
<manual version="6.0"/>
</versions>
-
+
</mysqloption>
</mysqloptions>
Modified: trunk/refman-5.1/mysql-cluster-cge-building-tmp.xml
===================================================================
--- trunk/refman-5.1/mysql-cluster-cge-building-tmp.xml 2007-12-07 19:59:29 UTC (rev 9201)
+++ trunk/refman-5.1/mysql-cluster-cge-building-tmp.xml 2007-12-07 20:20:17 UTC (rev 9202)
Changed blocks: 14, Lines Added: 101, Lines Deleted: 41; 9921 bytes
@@ -9,9 +9,10 @@
<para>
This section provides instructions on building &mccge-series; using
- the source code that can be obtained from the MySQL FTP site and the
+ the source code that can be obtained from the MySQL FTP site or
+ <ulink url="http://mysql.bkbits.net/"/> and the
<command>build_mccge.sh</command> script that can be found in the
- source code's <filename>BUILD</filename> directory.
+ source code <filename>BUILD</filename> directory.
</para>
<section id="mysql-cluster-cge-building-basics">
@@ -20,40 +21,39 @@
<para>
The <command>build_mccge.sh</command> script is intended to
- provide an easy way to build &mccge-series; binaries on the
- principal supported platforms for this product:
+ provide an easy way to build 32-bit or 64-bit &mccge-series;
+ binaries on the principal supported platforms for this product:
<itemizedlist>
<listitem>
<para>
- Linux/x86 32-bit or 64-bit, using the <command>gcc</command>
- compiler.
+ Linux/x86, using <command>gcc</command> or Intel's
+ <command>icc</command> compiler.
</para>
</listitem>
<listitem>
<para>
- Linux/x86 32-bit or 64-bit, using Intel's
- <command>icc</command> compiler.
+ Solaris/x86, using <command>gcc</command>.
</para>
</listitem>
<listitem>
<para>
- Solaris/x86, also using <command>gcc</command>.
+ Solaris/SPARC, using the <command>Forte</command> compiler.
</para>
</listitem>
<listitem>
<para>
- Solaris/Sparc, using the <command>Forte</command> compiler.
+ MacOS X on x86, using <command>gcc</command>.
</para>
</listitem>
<listitem>
<para>
- MacOS X, using <command>gcc</command>.
+ FreeBSD/x86, using <command>gcc</command>.
</para>
</listitem>
@@ -61,21 +61,32 @@
These instructions are <emphasis>not</emphasis> intended to cover
obtaining and installing the compiler and other tools needed to
- build the &mccge-series; (often abbreviated as
- <quote>MCCGE</quote> or <quote>CGE</quote>) software. For help
- with doing so, please see the documentation provided for your
- operating platform.
+ build the &mccge-series; software (sometimes abbreviated as
+ <quote>MCCGE</quote>). For help with this, see the documentation
+ provided for your operating platform. For information on what
+ tools are required and recommended, see
+ <xref linkend="installing-source"/>, and
+ <xref linkend="installing-source-tree"/>.
</para>
<para>
The script automatically detects the CPU type and operating system
of the machine on which it is used; in most cases this also
- determines which compiler to use, the exception being Linux/x86
- where you can choose between <command>gcc</command> (the default)
- and <command>icc</command>. To build on any of these platforms
- (using <command>gcc</command> on Linux), it is often sufficient to
- invoke the script without any extra options, like this:
+ determines which compiler to use.
+ <note>
+ <para>
+ For Linux running on x86 processors, <command>gcc</command> is
+ the default, but you can also choose the
+ <command>icc</command> compiler if it is available on your
+ system.
+ </para>
+ </note>
+
+ To build on any of these platforms (using <command>gcc</command>
+ on Linux), it is often sufficient to invoke the script without any
+ extra options, like this:
+
<programlisting>
shell> <userinput>cd <replaceable>mccge-root</replaceable></userinput>
shell> <userinput>BUILD/build_mccge.sh</userinput>
@@ -127,13 +138,52 @@
<para>
Using the <option>--package</option> option with
<command>build_mccge.sh</command>, it is possible to build a
- number of different packages. These include a
- <quote>Classic</quote> version of MySQL having only the
- <literal>MyISAM</literal> storage engine, a <quote>Pro</quote>
- package including all storage engines and other features except
- for MySQL Cluster, and a <quote>Max</quote> package including all
- of these features plus MySQL Cluster (this is the default package
- when the <option>--developer</option> option is used).
+ number of different packages, listed here:
+
+ <itemizedlist>
+
+ <listitem>
+ <formalpara>
+
+ <title>Classic</title>
+
+ <para>
+ This package includes only the <literal>MyISAM</literal>
+ and <literal>CSV</literal> storage engines.
+ </para>
+
+ </formalpara>
+ </listitem>
+
+ <listitem>
+ <formalpara>
+
+ <title>Pro</title>
+
+ <para>
+ This packages includes all storage engines and other
+ features except for MySQL Cluster.
+ </para>
+
+ </formalpara>
+ </listitem>
+
+ <listitem>
+ <formalpara>
+
+ <title>Extended</title>
+
+ <para>
+ This package includes all of the features found in the Pro
+ package with the addition of MySQL Cluster. This is the
+ default package when the <option>--developer</option>
+ option is used.
+ </para>
+
+ </formalpara>
+ </listitem>
+
+ </itemizedlist>
</para>
<para>
@@ -158,7 +208,7 @@
</thead>
<tbody>
<row>
- <entry><option>--package=ndb</option></entry>
+ <entry><option>--package=cge</option></entry>
<entry><literal>ARCHIVE</literal>, <literal>BLACKHOLE</literal>,
<literal>CSV</literal>, <literal>EXAMPLE</literal>,
<literal>FEDERATED</literal>, <literal>MYISAM</literal>,
@@ -168,7 +218,7 @@
<entry><literal>-cge</literal></entry>
</row>
<row>
- <entry><option>--package=max</option></entry>
+ <entry><option>--package=extended</option></entry>
<entry><literal>ARCHIVE</literal>, <literal>BLACKHOLE</literal>,
<literal>CSV</literal>, <literal>EXAMPLE</literal>,
<literal>FEDERATED</literal>, <literal>INNODB</literal>,
@@ -208,6 +258,14 @@
options).
</para>
+ <note>
+ <para>
+ Because the &mccge-series; sources are currently based on MySQL
+ 5.1, there is no support in &mccge-series; for the
+ <literal>Falcon</literal> storage engine at this time.
+ </para>
+ </note>
+
<formalpara>
<title>Additional package options</title>
@@ -256,7 +314,7 @@
This option changes a number of things to make the
version built more appropriate to developers' debugging
and testing needs. It changes the default package to
- Max. It also changes the default warning mode from
+ Extended. It also changes the default warning mode from
<literal>none</literal> to <literal>normal</literal>,
which allows an extensive list of warnings to be
generated.
@@ -271,7 +329,7 @@
<title><option>--error-inject</option></title>
<para>
- This option is used only when the
+ This option is honored only when the
<option>--developer</option> option is also used, and
enables error injection in both the MySQL Server and on
MySQL Cluster data nodes.
@@ -375,9 +433,9 @@
<note>
<para>
<literal>MyISAM</literal> support is always built
- into the MySQL Server. The server cannot be built
- without the <literal>MyISAM</literal> storage
- engine.
+ into the MySQL Server. The server
+ <emphasis>cannot</emphasis> be built without the
+ <literal>MyISAM</literal> storage engine.
</para>
</note></entry>
<entry/>
@@ -440,9 +498,9 @@
</formalpara>
<para>
- The MySQL Cluster Carrier Grade Edition builds (built using
- <option>--package=ndb</option> or <option>--package=max</option>)
- add the following options:
+ The &mccge-series; builds (built using
+ <option>--package=cge</option> or
+ <option>--package=extended</option>) add the following options:
<itemizedlist>
@@ -495,7 +553,7 @@
<title><option>--with-innodb</option></title>
<para>
- Included in the Pro and Max packages only.
+ Included in the Pro and Extended packages only.
</para>
</formalpara>
@@ -519,11 +577,11 @@
<listitem>
<formalpara>
- <title><option/></title>
+ <title><option>--with-server-suffix</option></title>
<para>
- --with-server-suffix Sets the server suffix on the MySQL
- version, by package, as described in
+ Sets the server suffix on the MySQL version, by package,
+ as described in
<xref linkend="mysql-cluster-cge-building-packages"/>.
</para>
@@ -535,6 +593,8 @@
</formalpara>
+<!-- EDITS THORUGH HERE -->
+
<formalpara>
<title>Other options</title>
Modified: trunk/refman-5.1/mysql-cluster-replication.xml
===================================================================
--- trunk/refman-5.1/mysql-cluster-replication.xml 2007-12-07 19:59:29 UTC (rev 9201)
+++ trunk/refman-5.1/mysql-cluster-replication.xml 2007-12-07 20:20:17 UTC (rev 9202)
Changed blocks: 6, Lines Added: 11, Lines Deleted: 12; 3258 bytes
@@ -2336,7 +2336,7 @@
<title>Logging full or partial rows (<option>--ndb-log-updated-only</option>
option)</title>
- <para>
+ <para id="option_mysqld_ndb_log_updated_only">
For purposes of conflict resolution, there are two basic methods
of logging rows, as determined by the setting of the
<option>--ndb-log-updated-only</option> option for
@@ -2360,11 +2360,10 @@
</itemizedlist>
- In general it is preferable to log full rows. However, depending
- on the application, it may be sufficient to log only the
- updates, and can be more efficient to do so. This can be done by
- setting <option>--ndb-log-updated-only</option> to
- <literal>1</literal> or <literal>ON</literal>.
+ It more efficient to log updated columns only; however, if you
+ need to log full rows, you can do so by setting
+ <option>--ndb-log-updated-only</option> to <literal>0</literal>
+ or <literal>OFF</literal>.
</para>
</formalpara>
@@ -2374,15 +2373,15 @@
<title>Logging changed data as updates
(<option>--ndb-log-update-as-write</option> option)</title>
- <para>
+ <para id="option_mysqld_ndb_log_update_as_write">
Either of these logging methods can be configured to be done
with or without the <quote>before</quote> image as determined by
the setting of another MySQL Server option
<option>--ndb-log-update-as-write</option>. Because conflict
resolution is done in the MySQL Server's update handler, it is
necessary to control logging on the master such that updates are
- updates and not writes as in in mainline MySQL 5.1. This option
- is turned on by default; to turn it off, start the server with
+ updates and not writes. This option is turned on by default; to
+ turn it off, start the server with
<option>--ndb-log-update-as-write=0</option> or
<option>--ndb-log-update-as-write=OFF</option>.
</para>
@@ -2758,7 +2757,7 @@
<para>
The following examples assume that you have already a working
- replication setup, as described in
+ MySQL Cluster replication setup, as described in
<xref linkend="mysql-cluster-replication-preparation"/>, and
<xref linkend="mysql-cluster-replication-starting"/>.
@@ -2783,7 +2782,7 @@
<para>
Make sure that you have started the master
<command>mysqld</command> with
- <option>-–ndb-log-updates-as-writes=OFF</option>.
+ <option>-–ndb-log-update-as-write=OFF</option>.
</para>
</listitem>
@@ -2825,7 +2824,7 @@
<replaceable>columns</replaceable>
mycol INT UNSIGNED,
<replaceable>columns</replaceable>
-);
+) ENGINE=NDB;
</programlisting>
Now, when updates are done on this table, conflict
Modified: trunk/refman-6.0/mysql-cluster-replication.xml
===================================================================
--- trunk/refman-6.0/mysql-cluster-replication.xml 2007-12-07 19:59:29 UTC (rev 9201)
+++ trunk/refman-6.0/mysql-cluster-replication.xml 2007-12-07 20:20:17 UTC (rev 9202)
Changed blocks: 7, Lines Added: 450, Lines Deleted: 363; 37931 bytes
@@ -2190,52 +2190,56 @@
Cluster Replication provides a means of resolving such conflicts
by allowing a user defined <quote>timestamp</quote> column to be
used to determine whether or not an update to the row on a given
- master should be applied on the slave. There are two ways in which
- this column can be used, as explained in the next two paragraphs.
+ master should be applied on the slave.
</para>
<para>
- In the first method, if the <quote>timestamp</quote> for a given
- row coming from the master is higher than that on the slave, it is
- applied; otherwise it is not applied on the slave. This ensures
- that, in the event of a conflict, the version of the row that was
- most recently updated is the version that persists.
+ Different methods can be used to compare <quote>timestamps</quote>
+ on the slave when conflicts occur, as explained later in this
+ section; the method used can be set on a per-table basis.
</para>
- <para>
- In the second method for conflict resolution, the update is
- applied only if the <quote>timestamp</quote> column is the same on
- both the master and the slave. This ensures that updates are not
- applied from the wrong master.
- </para>
+ <formalpara>
- <para>
- This replication scheme, also known as <quote>changed parameter
- only replication</quote>, is configurable on a per-table basis.
+ <title>Requirements</title>
- <itemizedlist>
+ <para>
+ Preparations for conflict resolution must be made on both the
+ master and the slave:
- <listitem>
- <para>
- On the master, it must be determined which columns to send
- (all columns or only those that have been updated).
- </para>
- </listitem>
+ <itemizedlist>
- <listitem>
- <para>
- On the slave, it must be determined which type of conflict
- resolution to apply (<quote>latest timestamp wins</quote>,
- <quote>same timestamp wins</quote>, or none).
- </para>
- </listitem>
+ <listitem>
+ <para>
+ On the master writing the binlogs, you must determine
+ which columns are sent (all columns or only those that
+ have been updated). This is done for the MySQL Server as a
+ while by applying the <command>mysqld</command> startup
+ option <option>-–ndb-log-updated-only</option>
+ (described later in this section) or on a per-table basis
+ by entries in the <literal>mysql.ndb_replication</literal>
+ table.
+ </para>
+ </listitem>
- </itemizedlist>
+ <listitem>
+ <para>
+ On the slave, you must determine which type of conflict
+ resolution to apply (<quote>latest timestamp wins</quote>,
+ <quote>same timestamp wins</quote>, or none). This is done
+ using the <literal>mysql.ndb_replication</literal> system
+ table, on a per-table basis.
+ </para>
+ </listitem>
- If only some but not all columns are sent, then the master and
- slave can diverge.
- </para>
+ </itemizedlist>
+ If only some but not all columns are sent, then the master and
+ slave can diverge.
+ </para>
+
+ </formalpara>
+
<note>
<para>
We refer to the column used for determining updates as a
@@ -2250,150 +2254,141 @@
<primary>--ndb-log-update-as-write (mysqld option)</primary>
</indexterm>
- <para>
- We can see update operations in terms of <quote>before</quote> and
- <quote>after</quote> images — that is, the states of the
- table before and after the update is applied. Normally, when
- updating a table with a primary key, the <quote>before</quote>
- image is not of great interest; however, when we need to determine
- on a per-update basis whether or not to use the updated values on
- a replication slave, we need to make sure that both images are
- written to the master's binary log. This is done with the
- <option>--ndb-log-update-as-write</option> startup option for
- <command>mysqld</command>, as described later in this section.
- </para>
+ <formalpara>
- <para>
- Whether logging of complete rows or of updated columns only is
- done is decided when the MySQL server is started, and cannot be
- changed online; you must either restart <command>mysqld</command>,
- or start a new <command>mysqld</command> instance with different
- logging options.
- </para>
+ <title>Master column control</title>
- <para>
- For purposes of conflict resolution, there are two basic methods
- of logging rows:
+ <para>
+ We can see update operations in terms of <quote>before</quote>
+ and <quote>after</quote> images — that is, the states of
+ the table before and after the update is applied. Normally, when
+ updating a table with a primary key, the <quote>before</quote>
+ image is not of great interest; however, when we need to
+ determine on a per-update basis whether or not to use the
+ updated values on a replication slave, we need to make sure that
+ both images are written to the master's binary log. This is done
+ with the <option>--ndb-log-update-as-write</option> startup
+ option for <command>mysqld</command>, as described later in this
+ section.
- <itemizedlist>
-
- <listitem>
+ <important>
<para>
- Log complete rows
+ Whether logging of complete rows or of updated columns only
+ is done is decided when the MySQL server is started, and
+ cannot be changed online; you must either restart
+ <command>mysqld</command>, or start a new
+ <command>mysqld</command> instance with different logging
+ options.
</para>
- </listitem>
+ </important>
+ </para>
- <listitem>
- <para>
- Log only column data that has been updated — that is,
- column data whose value has been set, regardless of whether
- or not this value was actually changed.
- </para>
- </listitem>
+ </formalpara>
- </itemizedlist>
+ <indexterm>
+ <primary>conflict resolution</primary>
+ <secondary>mysqld startup options</secondary>
+ </indexterm>
- Either of the above logging methods can be configured to be done
- with or without the <quote>before</quote> image.
- </para>
-
<formalpara>
- <title><command>mysqld</command> startup options</title>
+ <title>Logging full or partial rows (<option>--ndb-log-updated-only</option>
+ option)</title>
- <indexterm>
- <primary>conflict resolution</primary>
- <secondary>mysqld startup options</secondary>
- </indexterm>
+ <para id="option_mysqld_ndb_log_updated_only">
+ For purposes of conflict resolution, there are two basic methods
+ of logging rows, as determined by the setting of the
+ <option>--ndb-log-updated-only</option> option for
+ <command>mysqld</command>:
- <para>
- The following <command>mysqld</command> startup options are
- available to control conflict resolution:
-
<itemizedlist>
<listitem>
- <formalpara>
-
- <title><option>--ndb-log-update-as-write</option></title>
-
- <indexterm>
- <primary>--ndb-log-update-as-write (mysqld option)</primary>
- </indexterm>
-
- <para>
- Because conflict resolution is done in the MySQL
- Server's update handler, it is necessary to control
- logging on the master such that updates are updates and
- not writes as in in mainline MySQL 5.1. This option is
- turned on by default; to turn it off, start the server
- with <option>--ndb-log-update-as-write=0</option> or
- <option>--ndb-log-update-as-write=OFF</option>.
- </para>
-
- </formalpara>
+ <para>
+ Log complete rows
+ </para>
</listitem>
<listitem>
- <formalpara>
+ <para>
+ Log only column data that has been updated — that
+ is, column data whose value has been set, regardless of
+ whether or not this value was actually changed.
+ </para>
+ </listitem>
- <title><option>--ndb-log-updated-only</option></title>
+ </itemizedlist>
- <indexterm>
- <primary>--ndb-log-updated-only (mysqld option)</primary>
- </indexterm>
+ It more efficient to log updated columns only; however, if you
+ need to log full rows, you can do so by setting
+ <option>--ndb-log-updated-only</option> to <literal>0</literal>
+ or <literal>OFF</literal>.
+ </para>
- <para>
- In general it is preferable to log full rows. However,
- depending on the application, it may be sufficient to
- log only the updates, and can be more efficient to do
- so. This can be done by setting
- <option>--ndb-log-updated-only</option> to
- <literal>1</literal> or <literal>ON</literal>.
- </para>
+ </formalpara>
- </formalpara>
- </listitem>
+ <formalpara>
- </itemizedlist>
+ <title>Logging changed data as updates
+ (<option>--ndb-log-update-as-write</option> option)</title>
+
+ <para id="option_mysqld_ndb_log_update_as_write">
+ Either of these logging methods can be configured to be done
+ with or without the <quote>before</quote> image as determined by
+ the setting of another MySQL Server option
+ <option>--ndb-log-update-as-write</option>. Because conflict
+ resolution is done in the MySQL Server's update handler, it is
+ necessary to control logging on the master such that updates are
+ updates and not writes. This option is turned on by default; to
+ turn it off, start the server with
+ <option>--ndb-log-update-as-write=0</option> or
+ <option>--ndb-log-update-as-write=OFF</option>.
</para>
</formalpara>
- <para>
- The server status variable <literal>Ndb_conflict_fn_max</literal>
- provides a count of the number of times that a row was not applied
- on the current SQL node due to <quote>greatest timestamp
- wins</quote> conflict resolution since the last time that
- <command>mysqld</command> was started. The number of times that a
- row was not applied as the result of <quote>same timestamp
- wins</quote> conflict resolution on a given
- <command>mysqld</command> since the last time it was restarted is
- given by the global status variable
- <literal>Ndb_conflict_fn_old</literal>. In addition to
- incrementing <literal>Ndb_conflict_fn_old</literal>, the primary
- key of the row that was not used is inserted into an
- <firstterm>exceptions table</firstterm>, as explained later in
- this section.
- </para>
-
<indexterm>
<primary>conflict resolution</primary>
<secondary>enabling</secondary>
</indexterm>
- <para>
- To enable conflict resolution, it is necessary to create an
- <literal>ndb_replication</literal> table in the
- <literal>mysql</literal> system database on the master, the slave,
- or both, depending on the conflict resolution type and method to
- be employed. This table is used in order to control logging and
- conflict resolution function on a per-table basis, and has one row
- per table invokved in replication. Each row in
- <literal>mysql.ndb_replication</literal> corresponding to a given
- table specifies how to log and resolve conflicts for that table.
- The definition of this table is shown here:
+ <formalpara>
+ <title>Conflict resolution control</title>
+
+ <para>
+ Conflict resolution is usually enabled on the server where
+ conflicts can occur. Like logging method selection, it is
+ enabled by entries in the
+ <literal>mysql.ndb_replication</literal> table.
+ </para>
+
+ </formalpara>
+
+ <formalpara>
+
+ <title>The <literal>ndb_replication</literal> system table</title>
+
+ <para>
+ To enable conflict resolution, it is necessary to create an
+ <literal>ndb_replication</literal> table in the
+ <literal>mysql</literal> system database on the master, the
+ slave, or both, depending on the conflict resolution type and
+ method to be employed. This table is used to control logging and
+ conflict resolution functions on a per-table basis, and has one
+ row per table invoved in replication.
+ <literal>ndb_replication</literal> is created and filled with
+ control information on the server where the conflict is to be
+ resolved. In a simple master-slave setup where data can also be
+ changed locally on the slave this will typically be the slave.
+ In a more complex master-master (2-way) replication schema this
+ will usually be all of the masters involved. Each row in
+ <literal>mysql.ndb_replication</literal> corresponds to a table
+ being replicated, and specifies how to log and resolve conflicts
+ (that is, which conflict resolution function, if any, to use)
+ for that table. The definition of the
+ <literal>mysql.ndb_replication</literal> table is shown here:
+
<programlisting>
CREATE TABLE mysql.ndb_replication (
db VARBINARY(63),
@@ -2406,172 +2401,216 @@
PARTITION BY KEY(db,table_name);
</programlisting>
- The columns in this table are described in the following list:
+ The columns in this table are described in the following list:
- <itemizedlist>
+ <itemizedlist>
- <listitem>
- <formalpara>
+ <listitem>
+ <formalpara>
- <title><literal>db</literal></title>
+ <title><literal>db</literal></title>
- <para>
- The name of the database containing the table to be
- replicated.
- </para>
+ <para>
+ The name of the database containing the table to be
+ replicated.
+ </para>
- </formalpara>
- </listitem>
+ </formalpara>
+ </listitem>
- <listitem>
- <formalpara>
+ <listitem>
+ <formalpara>
- <title><literal>table_name</literal></title>
+ <title><literal>table_name</literal></title>
- <para>
- The name of the table to be replicated.
- </para>
+ <para>
+ The name of the table to be replicated.
+ </para>
- </formalpara>
- </listitem>
+ </formalpara>
+ </listitem>
- <listitem>
- <formalpara>
+ <listitem>
+ <formalpara>
- <title><literal>server_id</literal></title>
+ <title><literal>server_id</literal></title>
- <para>
- The unique server ID of the MySQL instance (SQL node)
- where the table resides.
- </para>
+ <para>
+ The unique server ID of the MySQL instance (SQL node)
+ where the table resides.
+ </para>
- </formalpara>
- </listitem>
+ </formalpara>
+ </listitem>
- <listitem>
- <formalpara>
+ <listitem>
+ <formalpara>
- <title><literal>binlog_type</literal></title>
+ <title><literal>binlog_type</literal></title>
- <para>
- The type of binary logging to be employed. This is
- determined as shown in the following table:
+ <para>
+ The type of binary logging to be employed. This is
+ determined as shown in the following table:
- <informaltable>
- <tgroup cols="3">
- <colspec colwidth="15*"/>
- <colspec colwidth="30*"/>
- <colspec colwidth="55*"/>
- <thead>
- <row>
- <entry>Value</entry>
- <entry>Internal Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry><literal>NBT_DEFAULT</literal></entry>
- <entry>Use server default</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry><literal>NBT_NO_LOGGING</literal></entry>
- <entry>Do not log this table in the binary log</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry><literal>NBT_UPDATED_ONLY</literal></entry>
- <entry>Only updated attributes are logged</entry>
- </row>
- <row>
- <entry>3</entry>
- <entry><literal>NBT_FULL</literal></entry>
- <entry>Log full row, even if not updated (MySQL server default behavior)</entry>
- </row>
- <row>
- <entry>4</entry>
- <entry><literal>NBT_USE_UPDATE</literal></entry>
- <entry>(For generating <literal>NBT_UPDATED_ONLY_USE_UPDATE</literal> and
- <literal>NBT_FULL_USE_UPDATE</literal> values
- only — not intended for separate use)</entry>
- </row>
- <row>
- <entry>5</entry>
- <entry>[<emphasis>Not used</emphasis>]</entry>
- <entry>---</entry>
- </row>
- <row>
- <entry>6</entry>
- <entry><literal>NBT_UPDATED_ONLY_USE_UPDATE</literal> (=
- <literal>NBT_UPDATED_ONLY |
- NBT_USE_UPDATE</literal>)</entry>
- <entry>Use updated attributes, even if values are unchanged</entry>
- </row>
- <row>
- <entry>7</entry>
- <entry><literal>NBT_FULL_USE_UPDATE</literal>(= <literal>NBT_FULL |
- NBT_USE_UPDATE</literal>)</entry>
- <entry>Use full row, even if values are unchanged</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
+ <informaltable>
+ <tgroup cols="3">
+ <colspec colwidth="15*"/>
+ <colspec colwidth="30*"/>
+ <colspec colwidth="55*"/>
+ <thead>
+ <row>
+ <entry>Value</entry>
+ <entry>Internal Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry><literal>NBT_DEFAULT</literal></entry>
+ <entry>Use server default</entry>
+ </row>
+ <row>
+ <entry>1</entry>
+ <entry><literal>NBT_NO_LOGGING</literal></entry>
+ <entry>Do not log this table in the binary log</entry>
+ </row>
+ <row>
+ <entry>2</entry>
+ <entry><literal>NBT_UPDATED_ONLY</literal></entry>
+ <entry>Only updated attributes are logged</entry>
+ </row>
+ <row>
+ <entry>3</entry>
+ <entry><literal>NBT_FULL</literal></entry>
+ <entry>Log full row, even if not updated (MySQL server default behavior)</entry>
+ </row>
+ <row>
+ <entry>4</entry>
+ <entry><literal>NBT_USE_UPDATE</literal></entry>
+ <entry>(For generating <literal>NBT_UPDATED_ONLY_USE_UPDATE</literal> and
+ <literal>NBT_FULL_USE_UPDATE</literal> values
+ only — not intended for separate use)</entry>
+ </row>
+ <row>
+ <entry>5</entry>
+ <entry>[<emphasis>Not used</emphasis>]</entry>
+ <entry>---</entry>
+ </row>
+ <row>
+ <entry>6</entry>
+ <entry><literal>NBT_UPDATED_ONLY_USE_UPDATE</literal> (=
+ <literal>NBT_UPDATED_ONLY |
+ NBT_USE_UPDATE</literal>)</entry>
+ <entry>Use updated attributes, even if values are unchanged</entry>
+ </row>
+ <row>
+ <entry>7</entry>
+ <entry><literal>NBT_FULL_USE_UPDATE</literal>(= <literal>NBT_FULL |
+ NBT_USE_UPDATE</literal>)</entry>
+ <entry>Use full row, even if values are unchanged</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
- </formalpara>
- </listitem>
+ </formalpara>
+ </listitem>
- <listitem>
- <formalpara>
+ <listitem>
+ <formalpara>
- <title><literal>conflict_fn</literal></title>
+ <title><literal>conflict_fn</literal></title>
- <para>
- The conflict resolution function to be applied. This
- function must be specified as one of the following:
+ <para>
+ The conflict resolution function to be applied. This
+ function must be specified as one of the following:
- <itemizedlist>
+ <itemizedlist>
- <listitem>
- <para>
- <literal>NDB$MAX(<replaceable>column_name</replaceable></literal>:
- Indicates that <quote>greatest timestamp
- wins</quote> conflict resolution is to be used.
- </para>
- </listitem>
+ <listitem>
+ <formalpara>
- <listitem>
- <para>
- <literal>NDB$OLD(<replaceable>column_name</replaceable></literal>:
- An update is applied only if the value of
- <replaceable>column_name</replaceable> is the same
- on both the master and the slave.
- </para>
- </listitem>
+ <title><literal>NDB$MAX(<replaceable>column_name</replaceable></literal>)</title>
- <listitem>
- <para>
- <literal>NULL</literal>: Indicates that conflict
- resolution is not to be used for the corresponding
- table
- </para>
- </listitem>
+ <para>
+ Indicates that <quote>greatest timestamp
+ wins</quote> conflict resolution is to be used
+ — that is, if the <quote>timestamp</quote>
+ for a given row coming from the master is higher
+ than that on the slave, it is applied; otherwise
+ it is not applied on the slave. This ensures
+ that, in the event of a conflict, the version of
+ the row that was most recently updated is the
+ version that persists.
+ </para>
- </itemizedlist>
+ </formalpara>
+ </listitem>
- .
- </para>
+ <listitem>
+ <formalpara>
- </formalpara>
- </listitem>
+ <title><literal>NDB$OLD(<replaceable>column_name</replaceable></literal>)</title>
- </itemizedlist>
- </para>
+ <para>
+ Indicates that an update is applied only if the
+ value of <replaceable>column_name</replaceable>
+ is the same on both the master and the slave.
+ This ensures that updates are not applied from
+ the wrong master.
+ </para>
+ </formalpara>
+ </listitem>
+
+ <listitem>
+ <para>
+ <literal>NULL</literal>: Indicates that conflict
+ resolution is not to be used for the corresponding
+ table
+ </para>
+ </listitem>
+
+ </itemizedlist>
+
+ .
+ </para>
+
+ </formalpara>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ </formalpara>
+
<formalpara>
+ <title>Status information</title>
+
+ <para>
+ The <literal>Ndb_conflict_fn_max</literal> server status
+ variable provides a count of the number of times that a row was
+ not applied on the current SQL node due to <quote>greatest
+ timestamp wins</quote> conflict resolution since the last time
+ that <command>mysqld</command> was started. Beginning with
+ MySQL-5.1.22-ndb-6.3.4, the number of times that a row was not
+ applied as the result of <quote>same timestamp wins</quote>
+ conflict resolution on a given <command>mysqld</command> since
+ the last time it was restarted is given by the global status
+ variable <literal>Ndb_conflict_fn_old</literal>. In addition to
+ incrementing <literal>Ndb_conflict_fn_old</literal>, the primary
+ key of the row that was not used is inserted into an
+ <firstterm>exceptions table</firstterm>, as explained later in
+ this section.
+ </para>
+
+ </formalpara>
+
+ <formalpara>
+
<title>Additional requirements for <quote>Same timestamp wins</quote> conflict
resolution</title>
@@ -2640,11 +2679,11 @@
<important>
<para>
The <literal>mysql.ndb_replication</literal> table is read when
- the table is set up for replication, so the row corresponding to
- a table to be replicated must be inserted into
+ a data table is set up for replication, so the row corresponding
+ to a table to be replicated must be inserted into
<literal>mysql.ndb_replication</literal>
- <emphasis>before</emphasis> creation of the table to be
- replicated takes place.
+ <emphasis>before</emphasis> the table to be replicated is
+ created.
</para>
</important>
@@ -2660,78 +2699,115 @@
<formalpara>
- <title><literal>NDB$MAX()</literal> example</title>
+ <title>Examples</title>
<para>
- Suppose you wish to enable <quote>greatest timestamp
- wins</quote> conflict resolution on table
- <literal>test.t1</literal>, using column
- <literal>mycol</literal> as the <quote>timestamp</quote>. This
- can be done using the following two steps:
+ The following examples assume that you have already a working
+ MySQL Cluster replication setup, as described in
+ <xref linkend="mysql-cluster-replication-preparation"/>, and
+ <xref linkend="mysql-cluster-replication-starting"/>.
<itemizedlist>
<listitem>
- <para>
- On the master, perform this <literal>INSERT</literal>
- statement:
+ <formalpara>
+ <title><literal>NDB$MAX()</literal> example</title>
+
+ <para>
+ Suppose you wish to enable <quote>greatest timestamp
+ wins</quote> conflict resolution on table
+ <literal>test.t1</literal>, using column
+ <literal>mycol</literal> as the
+ <quote>timestamp</quote>. This can be done using the
+ following steps:
+
+ <orderedlist>
+
+ <listitem>
+ <para>
+ Make sure that you have started the master
+ <command>mysqld</command> with
+ <option>-–ndb-log-update-as-write=OFF</option>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ On the master, perform this
+ <literal>INSERT</literal> statement:
+
<programlisting>
INSERT INTO mysql.ndb_replication
VALUES ('test', 't1', 0, NULL, 'NDB$MAX(mycol)');
</programlisting>
- </para>
+ </para>
- <para>
- Inserting a 0 into the <literal>server_id</literal>
- indicates that all SQL nodes accessing this table should
- use conflict resolution. If you want to use conflict
- resolution on a specific <command>mysqld</command> only,
- use the actual server ID.
- </para>
+ <para>
+ Inserting a 0 into the
+ <literal>server_id</literal> indicates that all
+ SQL nodes accessing this table should use conflict
+ resolution. If you want to use conflict resolution
+ on a specific <command>mysqld</command> only, use
+ the actual server ID.
+ </para>
- <para>
- Inserting <literal>NULL</literal> into the
- <literal>binlog_type</literal> column has the same effect
- as inserting 0 (<literal>NBT_DEFAULT</literal>); the
- server default is used.
- </para>
- </listitem>
+ <para>
+ Inserting <literal>NULL</literal> into the
+ <literal>binlog_type</literal> column has the same
+ effect as inserting 0
+ (<literal>NBT_DEFAULT</literal>); the server
+ default is used.
+ </para>
+ </listitem>
- <listitem>
- <para>
- Create the <literal>test.t1</literal> table:
+ <listitem>
+ <para>
+ Create the <literal>test.t1</literal> table:
<programlisting>
CREATE TABLE test.t1 (
<replaceable>columns</replaceable>
mycol INT UNSIGNED,
<replaceable>columns</replaceable>
-);
+) ENGINE=NDB;
</programlisting>
- Now, when updates are done on this table, conflict
- resolution will be applied, and the version of the row
- having the greatest value for <literal>mycol</literal>
- will be written to the slave.
- </para>
- </listitem>
+ Now, when updates are done on this table, conflict
+ resolution will be applied, and the version of the
+ row having the greatest value for
+ <literal>mycol</literal> will be written to the
+ slave.
+ </para>
+ </listitem>
- </itemizedlist>
- </para>
+ </orderedlist>
+ </para>
- </formalpara>
+ </formalpara>
- <formalpara>
+ <note>
+ <para>
+ Other <literal>binlog_type</literal> options —
+ such as <literal>NBT_UPDATED_ONLY_USE_UPDATE</literal>
+ should be used in order to control logging on the master
+ via the <literal>ndb_replication</literal> table rather
+ than by using command line options.
+ </para>
+ </note>
+ </listitem>
- <title><literal>NDB$OLD()</literal> example</title>
+ <listitem>
+ <formalpara>
- <para>
- Suppose an <literal>NDB</literal> table such as the one defined
- here is being replicated, and you wish to enable <quote>same
- timestamp wins</quote> conflict resolution for updates to this
- table:
+ <title><literal>NDB$OLD()</literal> example</title>
+ <para>
+ Suppose an <literal>NDB</literal> table such as the one
+ defined here is being replicated, and you wish to enable
+ <quote>same timestamp wins</quote> conflict resolution
+ for updates to this table:
+
<programlisting>
CREATE TABLE test.t2 (
a INT UNSIGNED NOT NULL,
@@ -2743,36 +2819,40 @@
) ENGINE=NDB;
</programlisting>
- The following steps are required, in the order shown:
+ The following steps are required, in the order shown:
- <orderedlist>
+ <orderedlist>
- <listitem>
- <para>
- First — and <emphasis>prior</emphasis> to creating
- <literal>test.t2</literal> — you must insert a row
- into the <literal>mysql.ndb_replication</literal> table,
- as shown here:
+ <listitem>
+ <para>
+ First — and <emphasis>prior</emphasis> to
+ creating <literal>test.t2</literal> — you
+ must insert a row into the
+ <literal>mysql.ndb_replication</literal> table, as
+ shown here:
<programlisting>
INSERT INTO mysql.ndb_replication
VALUES ('test', 't2', 0, NULL, 'NDB$OLD(mycol)');
</programlisting>
- Possible values for the <literal>binlog_type</literal>
- column are shown earlier in this section. The value
- <literal>'NDB$OLD(mycol)'</literal> should be inserted
- into the <literal>conflict_fn</literal> column.
- </para>
- </listitem>
+ Possible values for the
+ <literal>binlog_type</literal> column are shown
+ earlier in this section. The value
+ <literal>'NDB$OLD(mycol)'</literal> should be
+ inserted into the <literal>conflict_fn</literal>
+ column.
+ </para>
+ </listitem>
- <listitem>
- <para>
- Create an appropriate exceptions table for
- <literal>test.t2</literal>. The table creation statement
- shown here includes all required columns; any additional
- columns must be declared following these columns, and
- before the definition of the table's primary key.
+ <listitem>
+ <para>
+ Create an appropriate exceptions table for
+ <literal>test.t2</literal>. The table creation
+ statement shown here includes all required
+ columns; any additional columns must be declared
+ following these columns, and before the definition
+ of the table's primary key.
<programlisting>
CREATE TABLE test.t2$EX (
@@ -2786,24 +2866,31 @@
PRIMARY KEY(server_id, master_server_id, master_epoch, count)
) ENGINE=NDB;
</programlisting>
- </para>
- </listitem>
+ </para>
+ </listitem>
- <listitem>
- <para>
- Create the table <literal>test.t2</literal> as shown
- previously.
- </para>
+ <listitem>
+ <para>
+ Create the table <literal>test.t2</literal> as
+ shown previously.
+ </para>
+ </listitem>
+
+ </orderedlist>
+
+ These steps must be followed for every table for which
+ you wish to perform conflict resolution using
+ <literal>NDB$OLD()</literal>. For each such table, there
+ must be a corresponding row in
+ <literal>mysql.ndb_replication</literal>, and there must
+ be an exceptions table in the same database as the table
+ being replicated.
+ </para>
+
+ </formalpara>
</listitem>
- </orderedlist>
-
- These steps must be followed for every table for which you wish
- to perform conflict resolution using
- <literal>NDB$OLD()</literal>. For each such table, there must be
- a corresponding row in <literal>mysql.ndb_replication</literal>,
- and there must be an exceptions table in the same database as
- the table being replicated.
+ </itemizedlist>
</para>
</formalpara>
| Thread |
|---|
| • svn commit - mysqldoc@docsrva: r9202 - in trunk: dynamic-docs/command-optvars refman-5.1 refman-6.0 | jon | 7 Dec |